Web安全测试学习笔记-SQL注入-利用concat和updatexml函数

mysql数据库中有两个函数:concat和updatexml,在sql注入时经常组合使用,本文通过学习concat和updatexml函数的使用方法,结合实例来理解这种sql注入方式的原理。

concat函数是mysql的字符串连接函数,定义如下:

先来验证下concat函数的功能: 

select concat('m','y','s','q','l')  

验证结果:如定义所示,concat将字符串连接起来了

 

如果把SQL语句放在concat中,SQL语句会被执行么?

select concat((select last_name from users limit 0,1))

验证结果:concat中的sql语句可以被执行(这点对后面的sql注入非常重要

 

select concat(0x7e,(select user()) ,0x7e)

验证结果:16进制也能被自动转义(0x7e是 ~符号)

 

其次是updatexml函数,网上找的关于该函数的介绍:

 

 函数功能验证:

select updatexml(0,concat(0x7e,(select user()) ,0x7e)  ,0)

验证结果:concat执行sql注入语句,再利用updatexml的报错信息返回sql语句执行结果。这里你可能会问,难道不能直接用updatexml执行sql语句么?我试了一下,并不能,原因可能是updatexml第二个参数必须是字符串吧,所以才需要借助返回值为字符串的concat函数。

 

接下来是实操:下面是一个网站的登录请求,如果用户名错误,会返回Unknown user,如果密码错误会返回Invalid password.

尝试输入单引号,返回数据库的报错,并且得知表名为admins,说明存在sql注入:

 先用concat来注入,发现还是返回Unknown user,没有得到其他有用的信息:

再结合updatexml,在报错信息中返回了数据库用户root@localhost,看到这里,咱们应该更深入的理解了updatexml和concat注入的原理了吧:利用concat执行sql注入语句,再利用updatexml的报错信息将sql语句的执行结果返回

这里还有一个疑问:用concat+updatexml注入的时候,大家都会加上16进制的连接符(这里是0x7e,用其他16进制符号也可以的),为什么呢?如果不加呢?

不加的话返回内容可能会被吃掉部分,据说这是updatexml这个函数的特性。。。,如下:

接下来看下admins表中有哪些字段:

最后根据id依次查询admins表中的用户名和密码

 

 针对这个登录页面,其实有更好的sql注入方法,那就是万能密码^_^,使用万能密码不需要知道用户名和密码也能登录,如下:

那updatexml还留着干嘛呢?万能密码登录进去后不一定是admin权限,使用updatexml能拿到更多数据库信息~

除了select,还可以利用updatexml完成insert,update和delete注入,原理和select相同。如下:

insert into guestbook(comment_id,comment,name) values (2,'0livia' or updatexml(1,concat(0x7e,(version())),0) or'','Nervo')
delete from guestbook where comment_id=2 or updatexml(2,concat(0x7e,(database())),0)

  

 

 

一点点感悟:

1. 还是之前说过的:一定要对输入进行过滤,一定要拦截和处理数据库的异常和报错!!!

2. concat和updatexml的组合方式只是一种思路,对于其他类型的数据库,只要找到与这两个函数功能类似的函数就可以了!

 

如需转载,请注明出处,这是对他人劳动成果的尊重~

posted @ 2019-12-17 16:44  Sally_Zhang  阅读(5135)  评论(0编辑  收藏  举报