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)

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

其次是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语句的执行结果返回

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

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

 

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

那updatexml还留着干嘛呢?因为updatexml除了执行select语句,还能执行insert,delete等语句啊~ 而且万能密码登录进去后不一定是admin权限

一点点感悟:

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

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

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

猜你喜欢

转载自www.cnblogs.com/sallyzhang/p/12054596.html