欢迎大家访问我的GitHub博客
1. 理解SQL注入攻击的原理以及如何实施攻击
2. 找到利用SQL注入的方法并证明可行性
3.理解针对SQL注入攻击的防御措施。
由于实验环境已经在VM SeedUbuntu16.04上面配置完成,因此,直接在Firefox中访问即可。
也可以找到网站对应的文件夹目录。
本题目是使用的Apache服务器存储的所有web站点。根据题目提示,需要访问"/etc/ apache2/sites-available"目录,找到000-default.conf文件,该文件中的每个网站都有一个虚拟主机块,指定了站点的URL和文件系统中包含站点源的目录。
查看000-defult.conf文件,找到对应的VirtualHost块,可以找到需要访问的网站的信息包含其中,因此Apache Configuration已经完成。
登录进入mysql的console
使用已经建好的数据库Users。先查看有哪些数据库,接着load进入Users数据库。
使用SQL命令打印出来员工Alice的所有信息。此处使用的是select语法。
首先查到了所在的表名credential。接着对表名中的内容去检索。找到Name为Alice的信息。
直接查看/var/www/SQLInjections目录下的unsafe_home.php文件,查看文件中的SQL语句使用过程如下。
可以看到,首先是以Get方式从服务器获取了输入的用户名和口令。接着对口令用sha1函数做一次哈希。
查询过程就是对SQL语句在数据库中执行的过程,可以看到,此处是使用的WHERE name= “”and Password=“”的方式进行查询,此处使用的口令不是用户输入的口令,而是用户输入口令的sha1值。如果找到了匹配,则从数据库中返回相应信息,否则,提示用户输入有误。
输入用户名为admin’# 口令为123,即可实现绕过。
此处的原理是在php文件的检索数据库内容的时候没有对数据和代码相分离,因此,在查询name 的时候,输入的Username可以加入’使得引号闭合,加入#使得注释掉后面的内容,因此验证用户身份的过程通过SQL注入就绕过了对口令的验证,只验证用户名是否匹配,即可通过验证。
其中,在跳转之后,admin’#变为了admin’%23,这是因为URL编码的规则导致的。在URL编码中,#被编码为%23。
使用命令行的curl命令发送HTTP Request,其中与Task2.1类似,构造的username=admin’#,Password=123。
需要注意的是因为此处直接发送的是HTTP Request,即需要对特殊字符进行URL编码,此处用到的特殊字符有三个:’# &
查询URL编码表,分别用编码后的结果替换这三个特殊字符即可。
可以看到,成功发送了HTTP Request请求,并获得了web服务器的相应的html表单。
查看表单中的信息,找到相关的职员信息表格。如下图所示,分别包括了相应的colum,以及表单中的相应内容。
举个例子,查看回显的Alice相关信息,与在网站中的信息相对比是一致的,这说明在command line中也成功执行了SQL注入攻击,得到了职员信息表单。
此处其实就是堆叠注入,考虑的是在注入的时候,考虑连续注入两条命令,使用;为隔离。使用update命令来更新数据表。
输入的第二条语句是:
update credential set Username=‘lunan’ where Username=‘Alice’;#
其中#表示注释掉了后面的内容。语句的意思是更改用户名为Alice为lunan。
可以看到,此处注入出现了语法错误。在sql查询的时候出现问题。表示这个地方两条语句的注入是不成功的。
进入/var/www/SQLInjection目录下,查看unsafa_edit_backend.php文件,可以看到对输入的pwd也是过了一次sha1哈希函数。Sql语句是对一些nickname、email等信息使用UPDATE更新。
与上述方法相同,使用sql注入的漏洞,直接对pwd进行注释,绕过口令验证过程,进入Alice的主页。
成功登录进入之后,可以看到Alice的profile。其中Salary=20000.
此时需要使用SQL的Update语句去对Salary的这个column去更新,将Salary更新为30000。采用的语句是
Attacker’,Salary=’30000’where Name=’Alice’;# 将Salary篡改为了30000
注入完之后,再查看Alice的profile,可以看到,原来的Salary为20000,现在变成了30000。NickName被设置为了Attacker,表示注入成功。
此处是要修改Boby的salary信息,因为不知道Boby的口令,此处也是使用SQL注入的命令,绕过口令,登录进入Boby的主页。
可以看到Boby的主页信息,此处他的Salary为30000,需要将其修改为1。
此处使用的篡改方法是Attacker’,Salary=‘1’ where Name=‘Boby’;#
可以看到成功将Boby的Salary改成了1dollar。攻击成功。
此处需要使用与上面类似的方法修改Boby的password信息。此处首先使用的是sql注入的方法绕过了口令验证登录进了Boby的个人主页。
接着需要对Boby的密码在Update的基础上做出注入。查看源代码以及lab实验文档的资料后了解到,此处对口令的存储并不是明文存储,而是对口令过了一次sha1的哈希函数,因此这里需要对想要更改的Password过一次Sha1函数。
此处想要将Boby的口令更改为HACKED,因此使用Sha1在线工具,找到HACKED对应的sha1值。如图所示。
因此,便可类似上述修改的方式,修改了Boby的Password,唯一的不同就是这里先过了一次sha1函数。
首先是对unsafe_home.php文件的修改。为了防范敌手在home页面进行攻击。
以root身份修改unsafe_home.php文件。主要修改的是就是对输入数据送到数据库处理的过程,也就是在创建好与数据库的连接之后,需要对代码和数据相分离。
此处是根据文档中的提示,先预编译的指令,其中未知的内容用?代替。接着将参数输入的用户名和哈希后的口令绑定在预编译好的sql语句中。接着执行了查询的过程,并绑定了对应的输出结果。
接着按照之前使用的SQL注入的方法,对home页面注入,假设已知用户名Boby但不知道其口令的情况下是否可以登录进去。
可以看到,提示的是账户信息是不存在的,因为我们输入的用户名存在了注入情况,而这个数据是严格与代码相区分的,不会存在数据当作代码执行的情况。
接着尝试在已知用户名Boby,以及口令为之前设置好的HACKED登录。
可以看到,当输入正确的用户名和口令的时候成功登录进去。
说明防御措施实施成功,通过代码和数据相分离的机制,成功抵御了SQL注入攻击。
类似的防御方法对文件unsafe_edit_backend.php文件做修改。
修改之前,Boby的profile信息如下
尝试将Boby的Salary信息修改为2
与之前的注入方法类似,此处NickName设置为Defence,其余设置Salary字段为2
可以看到,输入的字符都被当作了数据处理,都被视为了NickName字符串,成功防御了篡改profile的攻击。
[1] SQL 语法 | 菜鸟教程 (runoob.com)
https://www.runoob.com/sql/sql-syntax.html
[2]SQL UPDATE 语句 | 菜鸟教程 (runoob.com)
https://www.runoob.com/sql/sql-update.html
[3]sql注入基础原理 - 简书 (jianshu.com)
https://www.jianshu.com/p/078df7a35671