前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >渗透测试SQL注入漏洞原理与验证(3)——SQL报错注入

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

原创
作者头像
zhouzhou的奇妙编程
发布2024-09-23 10:09:48
180
发布2024-09-23 10:09:48
举报
文章被收录于专栏:渗透测试专栏

报错注入

通过构造特定的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,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 报错注入
    • 报错注入的前提条件
      • Xpath类型函数(MySQL数据库版本号>=5.1.5)
        • extractvalue()
        • updatexml()
        • floor()、rand()、count()、group by联用
        • exp() (5.5.5<= MySQL数据库版本号<=5.5.49)
        • 汇总
    • SQL报错注入实例
      • 利用extractvalue()函数进行报错注入
        • 利用floor()函数进行报错注入
        相关产品与服务
        渗透测试服务
        腾讯云渗透测试服务(Penetration Test Service, PTS),为客户提供针对于 Web 应用、移动 APP、微信小程序的黑盒安全测试内容;可以覆盖安全漏洞全生命周期,包括漏洞的发现、利用、修复以及修复后的验证。使用腾讯云渗透测试服务,可以随时将安全测试这一动作加入到您的产品研发、应用上线、安全自检等计划中来。不仅快速且便捷,而且稳定可靠,易于管理,有效的提升应用的安全能力。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档