一个网站的安全性涉及很多方面,代码的安全性是其中的一个重要因素,代码审计就是用来提高代码安全性的,那么我们就来讲讲代码审计,这次我们用到的是dvwa。
DVWA (Damn Vulnerable Web Application) DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞。
下面简单的以dvwa里面sql注入的三种等级代码来说一下代码审计。
首先比较low、medium、high三种级别的php代码:
low:

简单的php代码审计[以dvwa为例]






medium:

简单的php代码审计[以dvwa为例]






high:


简单的php代码审计[以dvwa为例]



红框里面就是三种代码的不同之处,发现从low到medium多了一句,medium到high又多了一句。
dvwa的sql injection里面有个输入框,三种等级下输入1,结果都一样,浏览器地址栏变成:
?id=1&Submit=Submit#
输入框下面会出现:



简单的php代码审计[以dvwa为例]




·    当在low级下输入1',发现浏览器地址栏变成:
 
?id=1'&Submit=Submit#
并出现错误:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1
·     medium级下,输入1',发现地址栏和low级一样,提示错误:
 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1
·    再看high级下,输入1',地址栏依旧,没出现错误,也没有出现正常的查询结果。
 
 
正常情况下,当用户在输入框输入1,从数据库查询id=1的用户,查询语句是
SELECT first_name, last_name FROM users WHERE user_id = '$id'
就会得到id=1的用户信息。
但是在1后面加个单引号后在low和medium级别下出现错误,看回上面图片:
·    low级下没有对输入进行任何处理,直接把用户输入的东西放到查询语句中进行查询;
 
·    medium级下添加了mysql_real_escape_string()函数,这个函数是转义sql语句中使用的字符串中的特殊字符,就像在错误提示中显示在单引号前加\;
 
·    high级下在转义函数前面加了另一个函数stripslashes(),这个函数是去除addslashes()函数添加的反斜杠,因为high级下,php的magic_quotes_gpc为on,对所有的GET、POST和COOKIE数据自动运行addslashes()函数。所以要使用stripslashes()函数
 
三种等级下sql注入的情况很明显了,现在深入。
low:?id=1 order by 2+--+&Submit=Submit#

?id=1' order by 2+--+&Submit=Submit#

?id=1' union select 1,2+--+&Submit=Submit#

简单的php代码审计[以dvwa为例]


?id=1' union select 1,concat_ws(char(32,58,32),user(),database(),version())+--+&Submit=Submit#

简单的php代码审计[以dvwa为例]


就这样把当前用户、数据库、php版本爆了出来。concat_ws是mysql里面的函数。
medium下会自动加反斜杠转义特殊字符,会破坏查询语句,页面上会提示出错;high下id只有正常情况下才会出现正确信息,其余的都不会出现任何信息。
除此之外,high级别中还有两处不同,判断输入是否为数字并将其值用单引号包含起来,以确保非法字符无法起作用。

简单的php代码审计[以dvwa为例]



 
到high级别的php代码已经达到相当高水平的安全性了,但是不能说一定是最安全的,因为还是可能会出现漏洞的。代码审计就是检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞,并提供代码修订措施和建议。从而在系统开发阶段/运维阶段进行深入的问题查找和消灭过程。