sql注入的两个小技巧

在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注入成功比较困难了。上述模式构思比较巧妙,值得赞一下。

你可能感兴趣的:(sql,PHP,mysql,web开发)