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的组合方式只是一种思路,对于其他类型的数据库,只要找到与这两个函数功能类似的函数就可以了!
如需转载,请注明出处,这是对他人劳动成果的尊重~