关于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脚本
类似的结果
这就要求对用户输入的数据进行各种清洗,编码等等
小结
这几个函数是在看书的时候看到并罗列出来的,感觉有点意思,便记录下来