关于php代码审计中的xss的一点心得

1.echo函数

注意:这里演示的代码以GET传参为主

<?php
/**
 * Created by PhpStorm.
 * User: Mke
 * Date: 2020/4/29
 * Time: 16:42
 */
$a=$_GET['bb'];
#echo '123';
echo $a;

打开浏览器

很简单,这里可以简单的传入xss语句

<script>alert(/Mke/)</script>

效果如下

可以看到js代码执行了

这里的代码被传入到head标签里了,因此是可以执行的,但是一些特殊情况,比如说json页面,不是html结构(没有html页面应有的标签)因此不会被解析执行js代码

2.print_r函数

<?php
/**
 * Created by PhpStorm.
 * User: Mke
 * Date: 2020/4/29
 * Time: 16:42
 */
$a=$_GET['bb'];
//echo $a;
print_r($a);

道理是一样的,只要被html页面所解析然后返回到页面,就有可能存在xss漏洞

这是很直观的

实际代码审计过程比较复杂,你需要关注的暂且只有这些函数(如果只是找xss漏洞的话,2333,没错我就是传说中的低危小能手)
这里也是被嵌入H5页面的头部

3.print函数

<?php
/**
 * Created by PhpStorm.
 * User: Mke
 * Date: 2020/4/29
 * Time: 16:42
 */
$a=$_GET['bb'];
//echo $a;
//print_r($a);
print $a;

简单的就直接跳过辣

4.sprint函数

定义和用法
sprintf() 函数把格式化的字符串写入变量中。
arg1、arg2、++ 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
注释:如果 % 符号多于 arg 参数,则您必须使用占位符。占位符位于 % 符号之后,由数字和 "$" 组成。请参见例子 2。
提示:相关函数:printf()、 vprintf()、 vsprintf()、 fprintf() 和 vfprintf()
摘自https://www.w3school.com.cn/php/func_string_sprintf.asp

<?php
/**
 * Created by PhpStorm.
 * User: Mke
 * Date: 2020/4/29
 * Time: 16:42
 */
$a=$_GET['bb'];
//echo $a;
//print_r($a);
//print $a;
$cc=sprintf("这是一个xss演示%s",$a);
echo $cc;

由于sprintf函数并不能直接输出,只是起到一个传递格式化的参数的作用,所以这里用echo来打印存储到$cc中的字符
这里和echo触发xss是一样的,只是过程不太一样

此时xss语句嵌入的位置出现在body标签里面了,前面提到的几个相关函数也是类似的

5.die()函数

die() 函数输出一条消息,并退出当前脚本(如果传入的是字符串的话,就会输出这个字符串)

<?php
/**
 * Created by PhpStorm.
 * User: Mke
 * Date: 2020/4/29
 * Time: 16:42
 */
$a=$_GET['bb'];
//echo $a;
//print_r($a);
//print $a;
//$cc=sprintf("这是一个xss演示%s",$a);
//echo $cc;
die($a);

简单的演示,当然如果有程序员昏了头这样写的话,2333

此时出现在头部标签

6.var_dump()函数

var_dump() 函数用于输出变量的相关信息。
var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
摘自https://www.runoob.com/php/php-var_dump-function.html
这个函数比较常用,一般调试代码会用到

<?php
/**
 * Created by PhpStorm.
 * User: Mke
 * Date: 2020/4/29
 * Time: 16:42
 */
$a=$_GET['bb'];
//echo $a;
//print_r($a);
//print $a;
//$cc=sprintf("这是一个xss演示%s",$a);
//echo $cc;
//die($a);
$arr=array(1, 2, array($a, "b", "c"));
var_dump($arr);

这里就简单构造一个数组,然后从传入的参数获取一个输入的字符串

由于没有任何过滤,直接嵌入xss语句

可以看到代码被执行了

触发的原因在于,var_dump会把输入的字符再次传递到html页面上

7.var_export函数

var_export 输出或返回一个变量的字符串表示
此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。
可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。
(a = var_export()array,true) 将变量打印出来包括类型记录下来 然后输出,常用于记录日志
摘自:https://www.jianshu.com/p/96dcc1db468a

<?php
/**
 * Created by PhpStorm.
 * User: Mke
 * Date: 2020/4/29
 * Time: 16:42
 */
$a=$_GET['bb'];
//echo $a;
//print_r($a);
//print $a;
//$cc=sprintf("这是一个xss演示%s",$a);
//echo $cc;
//die($a);
$b = array (1, 2, array ($a, "b", "c"));
var_export ($b);

这个函数和var_dump类似都是可以处理数组的
详情:https://www.php.net/manual/zh/function.var-export.php
同样执行xss的办法也差不多

传个js脚本

类似的结果

这就要求对用户输入的数据进行各种清洗,编码等等

小结

这几个函数是在看书的时候看到并罗列出来的,感觉有点意思,便记录下来

原文地址:https://www.cnblogs.com/mke2fs/p/12803857.html