PHP代码审计 XSS专题

一,XSS反射型漏洞

典型造成这个漏洞的几个函数

①die()
<?php
die($_GET['1']);
?>
②print_r()
<?php
print_r($_GET['1']);
?>
③echo
printf
sprintf
die
var_dump
var_export

在这里插入图片描述

①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() 函数
字符转换函数,将字符转换为实体

 & (和号) 成为 &amp;
 " (双引号) 成为 &quot;
 ' (单引号) 成为 &#039;
 < (小于) 成为 &lt;
 > (大于) 成为 &gt;

<?php
$str = 'I love "PHP".';
echo htmlspecialchars($str, ENT_QUOTES); // 转换双引号和单引号
?>

输出为
<!DOCTYPE html>
<html>
<body>
I love &quot;PHP&quot;.
</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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

goddemon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值