从DVWA中学习PHP常见漏洞及防御

0x00 前言

“安全是一个整体,保证安全不在于强大的地方有多强大 而在于真正薄弱的地方在哪里”–剑心

漏洞形成的原因就是接受了不安全的变量输入,又没得到有效的过滤,最后进入一些对敏感的函数就会对安全造成威胁。比如出现在mysql_query()函数可能就会造成SQL注入漏洞,出现在eval()以及preg_replace()中可能导致代码的执行。

主要介绍DVWA上的漏洞及修复方案:
DVWA下载地址

0x01 SQL注入漏洞

low的级别下$id变量没有经过任何的过滤,直接传入了sql语句,造成字符型注入

POC:

‘ union select user,password from users#

SQL语句为:

SELECT first_name, last_name FROM users WHERE user_id = ‘’ union select user,password from users#

medium级别下虽然$id经过了mysql_real_escape_string转义了,可是因为后面的SQL语句$id没有单引号保护,会被系统认为是数值型,导致数值型注入

POC:

1 union select user,password from users

SQL语句为:

SELECT first_name, last_name FROM users WHERE user_id = 1 union select user,password from users

SQL注入修补方法

字符型注入漏洞修补方法:

PHP5.3之前版本在php.ini中设置magic_quotes_gpc=On; magic_quotes_quotes_gpc会对传入的$_POST,$_GET,$_SERVER里的 ‘,”,\进行转义。

但是PHP5.4之后,magic_quotes_quotes_gpc就被废除了。

还要使用mysql_real_escape_string()addslashes()对传入参数进行过滤,或者使用str_replace()对一些关键词进行替换。

但是addslashes()mysql_real_escape_string()在数据库字符集设为GBK时是可能被绕过的。

如果数据库字符集是GBK的情况下,可以把

$mysqli->query('SET NAMES gbk'); 

修改为:

$mysqli->set_charset('gbk');

数值型注入:

数值型注入比较好修补,只需要判断传入的变量是否为数值型就可以了(或者强行改成数值型mysql_numrows)

0x02 XSS漏洞

黑客往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到黑客的特殊目的,比如窃取用户cookies.或者进行其他操作。

low级别下$message,$name两个变量从$_POST传入,只是经过一些特殊字符的转换。并没有对尖括号进行转义,所以还是造成了XSS的产生。

POC:

<script>alert(1)<script>

medium级别下,虽然对$message进行了尖括号转义,而且对<script>进行了替换,但是$name没有进行转义,而且跨站脚本可以用多种标签,如<img />,等…。Name的<input />限制了maxlength=‘10’的长度,但是我们的防御对象是精通技术的黑客。这种html下的长度限制是可以直接通过浏览器修改..然后通过大小写成功绕过str_replace(),插入XSS.

POC:

<SCript>alert(1)</SCript>

XSS修复方法

在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码

在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码

在将不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码

在将不可信数据插入到Style属性里时,对这些数据进行CSS编码

在将不可信数据插入到HTML URL里时,对这些数据进行URL编码

使用富文本时,使用XSS规则引擎进行编码过滤

其实使用htmlspecialchars()在输出时对输出内容进行转义。在输出时进行转义比输入时进行转义效果更好,因为可以确保数据在入库时是完整的….不然丢失数据。

0x03 任意命令执行漏洞

参考文章:命令执行漏洞总结

0x04 暴力破解

加个google验证码,保证没有程序能识别出来…

0x05 文件包含漏洞

参考文章:文件包含漏洞总结

大爷,赏个铜板呗!