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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。