本文记录 PHP 代码审计的学习过程,教程为暗月 2015 版的 PHP 代码审计课程
1. 简介
-
存储型 XSS 漏洞
代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS 比较危险,容易造成蠕虫,盗窃cookie 等
-
审计 SQL 语句
主要是update insert 更新和插入语句内容输入输出没有被过滤或者过滤不严
-
防御
htmlspecialchars() 函数
预定义的字符是:
& (和号) 成为 & " (双引号) 成为 " ' (单引号) 成为 ' < (小于) 成为 < > (大于) 成为 >
2. 示例演示
-
在 DVWA 上测试存储型 XSS 漏洞
测试结果为弹窗
-
源代码中的函数分析
<?php if(isset($_POST['btnSign'])) { $message = trim($_POST['mtxMessage']); $name = trim($_POST['txtName']); // Sanitize message input $message = stripslashes($message); $message = mysql_real_escape_string($message); $message = htmlspecialchars($message); // Sanitize name input $name = stripslashes($name); $name = mysql_real_escape_string($name); $name = htmlspecialchars($name); $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');"; $result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' ); } ?>
以上用到了三个过滤函数,下面开始分析
-
stripslashes() 函数
stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
提示:该函数可用于清理从数据库中或者从 HTML 表单中取回的数据实例: <?php echo stripslashes("Who\'s Bill Gates?"); ?>
-
mysql_real_escape_string() 函数
(PHP 4 >= 4.3.0, PHP 5)
转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集下列字符受影响: \x00 \n \r \ ' " \x1a
-
htmlspecialchars() 函数
把预定义的字符转换为 HTML 实体。
预定义的字符是: & (和号)成为 & " (双引号)成为 " ' (单引号)成为 ' < (小于)成为 < > (大于)成为 >
如需把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数
htmlspecialchars(string,flags,character-set,double_encode) 语法格式中可以选择编码单引号或者双引号以及编码字符集