渗透测试SQL注入漏洞原理与验证(3)——SQL报错注入

2024-09-27 19:22:35 浏览数 (2)

报错注入

通过构造特定的SQL语句,让攻击者想要查询的信息(如数据库名、版本号、用户名等)通过页面的错误提示回显出来。

报错注入的前提条件

Web应用程序未关闭数据库报错函数,对于一些SQL语句的错误直接回显在页面上,后台未对一些具有报错功能的函数(如extractvalue、updatexml等)进行过滤。

Xpath类型函数(MySQL数据库版本号>=5.1.5)

extractvalue()

作用 : 对XML文档进行查询,相当于在HTML文件中用标签查找元素,该函数最大显示长度为32,超过长度可以配合substr、limit等函数来显示。

代码语言:txt复制
  extractvalue(XML_document,XPath_string)

  XML_document是String格式,为XML文档对象的名称
  XPath_string(Xpath格式的字符串),注入时可操作的地方

报错原理 : xml文档中查找字符位置是用 /xxx/xxx/xxx.. 这种格式,如果写入其他格式就会报错并且会返回写入的非法格式内容,错误信息如:XPATH syntax error:'xxxxxxxx'

实例如下:

代码语言:sql复制
mysql> select  extractvalue(1,concat('~',user()));

ERROR 1105(HY000):XPATH syntax error:'~root@localhost'

updatexml()

作用 : 改变文档中符合条件的节点的值,该函数最大显示长度为32,超过长度可以配合substr、limit等函数来显示。

代码语言:txt复制
updatexml(XML_document, XPath_string, new_value )

XML_document是String格式,为XML文档对象的名称
XPath_string (Xpath格式的字符串),注入时可操作的地方
new_value ,String格式,替换查找到的符合条件的数据

报错原理 : xml文档中查找字符位置是用 /xxx/xxx/xxx.. 这种格式,如果写入其他格式就会报错并且会返回写入的非法格式内容,错误信息如:XPATH syntax error:'xxxxxxxx' ,同extractvalue()。

代码语言:sql复制
mysql> select  updatexml(1,concat('~',user()),1);

ERROR 1105(HY000):XPATH syntax error:'~root@localhost'

floor()、rand()、count()、group by联用

  • floor(x):对参数x向下取整
  • rand():生成一个0~1之间的随机浮点数
  • count(*):统计某个表下总共有多少条记录
  • group by x : 按照(by)一定的规则 (x) 进行分组

报错原理 : group by 与 rand() 使用时,如果临时表中没有该主键,则在插入前会再计算一次rand(),然后再由group by将计算出来的主键直接插入到临时表格中,导致主键重复报错,错误信息如:

代码语言:txt复制
Duplicate entry '...'  for key 'group_key'  

实例如下:

代码语言:txt复制
mysal> select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables
group by x)a;


ERROR 1062 (23000): Duplicate entry 'root@localhost1' for key 'group_key'

exp() (5.5.5<= MySQL数据库版本号<=5.5.49)

作用 : 计算以e(自然常数)为底的幂值。

语法 : exp(x)。

报错原理 : 当参数x超过710时,exp()函数会报错,错误信息如:

代码语言:txt复制
DOUBLE value is out of range:....

实例如下:

代码语言:sql复制
mysql> select exp(~(select *from (select user()) as x));


ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual))'

汇总

SQL报错注入实例

此处以SQLi-Labs的less-1为例,介绍两种方式,利用具有报错功能的函数实现注入。

利用extractvalue()函数进行报错注入

利用floor()函数进行报错注入


本文部分图片摘自深信服安全服务认证工程师课程课件中,为方便个人学习使用,勿作商用!!!!文字内容为自己手打,并非直接搬运!如有侵权,请联系删除!!!

本文档所提供的信息仅用于教育目的及在获得明确授权的情况下进行渗透测试。任何未经授权使用本文档中技术信息的行为都是严格禁止的,并可能违反《中华人民共和国网络安全法》及相关法律法规。使用者应当合法合规地运用所学知识,不得用于非法入侵、破坏信息系统等恶意活动。我们强烈建议所有读者遵守当地法律与道德规范,在合法范围内探索信息技术。

我正在参与2024腾讯21天技术创作挑战赛|年中回顾特别季,年中技术沉淀,拯救你的flag,快来和我瓜分大奖!

0 人点赞