PHP代码审计 XSS专题
一,XSS反射型漏洞
①xss漏洞处基础
1.变量的直接输出
<?php
echo $_GET['xss'];
?>
如cs.php存在的是上面的这个源码
http://127.0.0.1/cs.php?xss=
2.$_SERVER 变量参数
$_SERVER[‘PHP_SELF’] //直接在URL中输出执行XSS
$_SERVER[‘HTTP_USER_AGENT’] //HTTP头中构造XSS
$_SERVER[‘HTTP_REFERER’] //Referer头中构造XSS
$_SERVER[‘REQUEST_URI’] //显示 URL 中的XSS内容
<?php
echo $_SERVER[];
?>
特殊绕过的xss
1.由于编码解码导致的xss
<?php
$a=urldecode($_GET['id']); //接收参数并进行url解码
$b=htmlspecialchars($a); //HTML ENCODE处理,到这里都是没有问题的
echo urldecode($b); //最后,url解码输出
?>
#如果把urldecode删除掉这个代码就是正常的,因为这里存在一个思路
三重编码即可绕过这个编码-->三重编码的原因,浏览器url本身也会一次编码导致,而对于%3C这些不会进行过滤
如
id=%25253Cscript%25253Ealert(/xss/)%25253C/script%25253E
2.html不规范
<?php
$name = htmlspecialchars($_GET['name']);
?>
<input type='text' class='search' value='<?=$name?>'>
#导致原因:函数htmlspecialchars只对”实体编码但不对单引号实体编码
#因此绕过思路
?name=222' οnclick='alert(/xxs/)
修复方法:将HTML标签的属性值用双引号引起
3.黑名单标签过滤的不全
<?php
$name = htmlspecialchars($_GET['name']);
$pregs = "/<script>| <\/script>|onclick|oncontextmenu|ondblclick|onmousedown|onmouseenter|onmouseleave|onmousemo ve|onmouseover|onmouseout|onmouseup|onkeydown|onkeypress|onkeyup/i";
$check = preg_match($pregs, $name);
if ($check) {
echo 'not found';
exit;
}
?>
<input type='text' class='search' value='<?=$name?>'>
#name=111' οnfοcus='alert(/xss/),利用fuzz的思路去绕标签过滤
②xss防御
xss中常用的三个防御函数
1.htmlspecialchars() 函数
字符转换函数,将字符转换为实体
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
如
<?php
$str = 'I love "PHP".';
echo htmlspecialchars($str, ENT_QUOTES); // 转换双引号和单引号
?>
输出为
<!DOCTYPE html>
<html>
<body>
I love "PHP".
</body>
</html>
如需把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数
2.mysql_real_escape_string() 函数
转义功能函数
(PHP 4 >= 4.3.0, PHP 5)
转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集
#下列字符受影响:
\x00
\n
\r
\
'
"
\x1a
3.stripslashes() 函数
stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
提示:该函数可用于清理从数据库中或者从 HTML 表单中取回的数据
实例:
<?php
echo stripslashes("Who\'s Bill Gates?");
?>
设置header的属性
①对cookie设置http-only属性
②在输出html时,加上CSP(Content Security Policy)的Http Header,进而限定引用别的网站的脚本文件
二,XSS存储型漏洞
原理:mysql_query()和update insert函数导致
源代码分析
<?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>' );
}
?>
#三个均为转义函数
对于存储类型xss的快速审计思路
可以利用这个来快速找
->insert($_POST)或者->insert($_GET)
还没有评论,来说两句吧...