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 文件包含漏洞
参考文章:文件包含漏洞总结