在xfocus看了一篇文章
UPDATE注射(mysql+php)的两个模式http://www.xfocus.net/articles/200508/815.html
分析一下他所说的两个模式:
假设有表userinfo
该表有三个字段 用户名username 用户密码pass 用户权限groupid
理论上将我们只能改自己的密码,无法改权限
我们要做的就是:利用修改用户密码的sql语句,趁机修改权限。 嘿嘿嘿嘿
mode1
++++++++++++++++++
如果sql语句是
update userinfo set pass=$p where username='xxx'
在这种情况下,我们令$p为 12345,groupid=1 即可
这样就可以修改自己的权限groupid
mode2
++++++++++++++++++
如果sql语句是
update userinfo set pass='$p' where username='xxx'
我们如果令$p为 12345',groupid='1
在magic_quotes_gpc=on的环境下,sql语句就会变成
update userinfo set pass='12345/',groupid=/'1' where username='xxx'
之所以这样,是因为gpc为on,会在敏感字符前加反斜杠
所以这样仅仅一个update语句达不到目的
怎么办呢?
这样
上一个update语句将userinfo中的pass更新为 12345',groupid='1 了
我们利用这个值
如果有selete语句将这个值取出来,赋给一个变量$pass
然后我们再构造下面的update语句
update userinfo set pass='$pass' where username='xxx'
这时的update语句就是
update userinfo set pass='12345',groupid='1' where username='xxx'
为什么此时没有加反斜杠?因为gpc仅对用户输入的字符串起作用吧
这时就可以修改我们自己的权限了
==================
总结
我们回顾上面两个模式,原理倒是不难理解
第一种模式是没有问题的,单一的update语句到处都是,轻易就可以利用
第二种模式是有点问题,这种模式要求的条件太苛刻了
请看
先有针对密码的update (操作1)
然后是针对密码的select (操作2)
然后是针对密码的update(操作3)
这种模式如果要成功,操作者必须仔细寻找这样的点,因为这时三条sql语句,单独一个页面是很难
具备这样的条件的。
当然,现在web开发者已经很认真了,多数人已经对sql注入问题格外关注,在编码上尽量避免,所以
现在再想简简单单就sql注入成功比较困难了。上述模式构思比较巧妙,值得赞一下。