PHP代码审计 XSS专题

Love The Way You Lie 2022-10-27 13:47 246阅读 0赞

一,XSS反射型漏洞

①xss漏洞处
基础
1.变量的直接输出

  1. <?php
  2. echo $_GET['xss'];
  3. ?>

如cs.php存在的是上面的这个源码
http://127.0.0.1/cs.php?xss=
在这里插入图片描述
2.$_SERVER 变量参数

  1. $_SERVER[‘PHP_SELF’] //直接在URL中输出执行XSS
  2. $_SERVER[‘HTTP_USER_AGENT’] //HTTP头中构造XSS
  3. $_SERVER[‘HTTP_REFERER’] //Referer头中构造XSS
  4. $_SERVER[‘REQUEST_URI’] //显示 URL 中的XSS内容
  5. <?php
  6. echo $_SERVER[];
  7. ?>

特殊绕过的xss
1.由于编码解码导致的xss

  1. <?php
  2. $a=urldecode($_GET['id']); //接收参数并进行url解码
  3. $b=htmlspecialchars($a); //HTML ENCODE处理,到这里都是没有问题的
  4. echo urldecode($b); //最后,url解码输出
  5. ?>
  6. #如果把urldecode删除掉这个代码就是正常的,因为这里存在一个思路
  7. 三重编码即可绕过这个编码-->三重编码的原因,浏览器url本身也会一次编码导致,而对于%3C这些不会进行过滤
  8. id=%25253Cscript%25253Ealert(/xss/)%25253C/script%25253E

在这里插入图片描述
2.html不规范

  1. <?php
  2. $name = htmlspecialchars($_GET['name']);
  3. ?>
  4. <input type='text' class='search' value='<?=$name?>'>
  5. #导致原因:函数htmlspecialchars只对”实体编码但不对单引号实体编码
  6. #因此绕过思路
  7. ?name=222' οnclick='alert(/xxs/)
  8. 修复方法:将HTML标签的属性值用双引号引起

3.黑名单标签过滤的不全

  1. <?php
  2. $name = htmlspecialchars($_GET['name']);
  3. $pregs = "/<script>| <\/script>|onclick|oncontextmenu|ondblclick|onmousedown|onmouseenter|onmouseleave|onmousemo ve|onmouseover|onmouseout|onmouseup|onkeydown|onkeypress|onkeyup/i";
  4. $check = preg_match($pregs, $name);
  5. if ($check) {
  6. echo 'not found';
  7. exit;
  8. }
  9. ?>
  10. <input type='text' class='search' value='<?=$name?>'>
  11. #name=111' οnfοcus='alert(/xss/),利用fuzz的思路去绕标签过滤

②xss防御

xss中常用的三个防御函数
1.htmlspecialchars() 函数
字符转换函数,将字符转换为实体

  1. & (和号) 成为 &
  2. " (双引号) 成为 "
  3. ' (单引号) 成为 '
  4. < (小于) 成为 <
  5. > (大于) 成为 >

  1. <?php
  2. $str = 'I love "PHP".';
  3. echo htmlspecialchars($str, ENT_QUOTES); // 转换双引号和单引号
  4. ?>
  5. 输出为
  6. <!DOCTYPE html>
  7. <html>
  8. <body>
  9. I love "PHP".
  10. </body>
  11. </html>

如需把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数

2.mysql_real_escape_string() 函数
转义功能函数
(PHP 4 >= 4.3.0, PHP 5)
转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集

  1. #下列字符受影响:
  2. \x00
  3. \n
  4. \r
  5. \
  6. '
  7. "
  8. \x1a

3.stripslashes() 函数

stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
提示:该函数可用于清理从数据库中或者从 HTML 表单中取回的数据

  1. 实例:
  2. <?php
  3. echo stripslashes("Who\'s Bill Gates?");
  4. ?>

设置header的属性

  1. ①对cookie设置http-only属性
  2. ②在输出html时,加上CSP(Content Security Policy)的Http Header,进而限定引用别的网站的脚本文件

二,XSS存储型漏洞

原理:mysql_query()和update insert函数导致
在这里插入图片描述
在这里插入图片描述
源代码分析

  1. <?php
  2. if(isset($_POST['btnSign']))
  3. {
  4. $message = trim($_POST['mtxMessage']);
  5. $name = trim($_POST['txtName']);
  6. // Sanitize message input
  7. $message = stripslashes($message);
  8. $message = mysql_real_escape_string($message);
  9. $message = htmlspecialchars($message);
  10. // Sanitize name input
  11. $name = stripslashes($name);
  12. $name = mysql_real_escape_string($name);
  13. $name = htmlspecialchars($name);
  14. $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";
  15. $result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
  16. }
  17. ?>
  18. #三个均为转义函数

对于存储类型xss的快速审计思路

  1. 可以利用这个来快速找
  2. ->insert($_POST)或者->insert($_GET)

发表评论

表情:
评论列表 (有 0 条评论,246人围观)

还没有评论,来说两句吧...

相关阅读

    相关 php代码审计(2)

    这个语言怎么这么没有节操。。我感觉它是什么框架都有自己的特色,然后特色多起来自成一派加入新版本里去了就。框架还好几个。大杂烩啊。不愧是脚本语言。 今天发现我太蠢了,应该跟着w

    相关 代码审计XSS 0day

    个人技术能力问题,先从xss挖! 步骤一:使用rips进行自动化审计 ![图片][2549b1efb1b3dcdcd52f332abcfece9f.png] 感觉这个好搞