复现一些qwb的题目
upload
可以通过dirsearch找到泄露的源码 , -u指定url, -e指定插件
如果是代码审计题,而且是文件很多的,需要找到利用点,我们直接搜索unserialize
找到一处可以利用的代码:
1 | public function login_check(){ |
接下来去寻找哪里调用了这个方法,在Profile这个类中1
2
3
4
5
6
7
8
9public function upload_img(){
if($this->checker){
if(!$this->checker->login_check()){
$curr_url="http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']."/index";
$this->redirect($curr_url,302);
exit();
}
}
...
upload_img方法
会调用login_check
反序列化
而这个操作中的 \$this->ext、\$this->filename_tmp、$this->filename 均可通过反序列化控制。
同时在Profile.php
文件的末尾还有一处
1 | public function __get($name) |
这两个函数的意思是如果访问了类中的private
属性,就会调用__get
方法,如果调用了类中不存在的方法,就会通过__call
对$this->name
所指向的方法进行调用
意味着我们可以调用任意的类方法
同时在Register.php
中有一处:1
2
3
4
5
6public function __destruct()
{
if(!$this->registed){
$this->checker->index();
}
}
首先上传一个图片马,之后通过Register
类的__destruct
方法,调用__get
方法得到函数名upload_img
,再调用__call
方法,通过调用upload_img
可以对图片马进行改名
如果我们将$this->checker
赋值为Profile
类,由于Profile
类中不存在index
方法,就会触发__call
,这样就能构造一条完成的攻击链
高明的黑客
1 | import os,re |