Web Security
信息搜集
信息搜集的重要性
古人云“知己知彼,百战不殆”,在现实世界和比赛中,信息搜集是前期的必备工作,也是重中之重。在CTF线上比赛的Web类题目中,信息搜集涵盖的面非常广,有备份文件、目录信息、Banner信息等,这就需要参赛者有丰富的经验,或者利用一些脚本来帮助自己发现题目信息、挖掘题目漏洞。本节会尽可能叙述在CTF线上比赛中Web类题目包含的信息搜集,也会推荐一些作者测试无误的开源工具软件。
因为信息搜集大部分是工具的使用(git泄露可能涉及git命令的应用),所以本章可能不会有太多的技术细节。同时,因为信息搜集的种类比较多,本章会尽可能地涵盖,如有不足之处还望理解;最后会通过比赛的实际例子来体现信息搜集的重要性。
信息搜集的分类
前期的题目信息搜集可能对于解决CTF线上比赛的题目有着非常重要的作用,下面将从敏感目录、敏感备份文件、Banner识别三方面来讲述基础的信息搜集,以及如何在CTF线上比赛中发现解题方向。
敏感目录泄露
通过敏感目录泄露,我们往往能获取网站的源代码和敏感的URL地址,如网站的后台地址等。
git泄露
【漏洞简介】git是一个主流的分布式版本控制系统,开发人员在开发过程中经常会遗忘.git文件夹,导致攻击者可以通过.git文件夹中的信息获取开发人员提交过的所有源码,进而可能导致服务器被攻击而沦陷。
(1)常规git泄露
常规git泄露:即没有任何其他操作,参赛者通过运用现成的工具或自己编写的脚本即可获取网站源码或者flag
工具:
GitHub - denny0223/scrabble: Simple tool to recover .git folder from remote server
本地docker搭建web环境
常见的搜集
题目描述
一共3部分flag
docker-compose.yml
version: '3.2' |
启动方式
docker-compose up -d
用dirsearch扫一下
可以看见三个目录可以访问
/.index.php.swp |
分别访问可以看到3个flag
flag1:n1book{info_1 |
题目Flag
n1book{info_1s_v3ry_imp0rtant_hack}
粗心的小李
题目描述
看看能不能找到信息吧?
docker-compose.yml
version: '3.2' |
启动方式
docker-compose up -d
访问http://127.0.0.1/.git/发现没东西
再访问http://127.0.0.1/.git/config
用scrabble扫一下试试
Githack也可以
本地查看发现生成了index.html文件
查看发现flag
题目Flag
n1book{git_looks_s0_easyfun}
CTFhub Index
然后Githack
flag就有了
git回滚
git作为一个版本控制工具,会记录每次提交(commit)的修改,所以当题目存在git泄露时,flag(敏感)文件可能在修改中被删除或被覆盖了,这时我们可以利用git的git reset命令来恢复到以前的版本。
除了使用“git reset”,更简单的方式是通过“git log-stat”命令查看每个commit修改了哪些文件,再用“git diff HEAD commit-id”比较在当前版本与想查看的commit之间的变化。
git泄露的其他利用
除了查看源码的常见利用方式,泄露的git中也可能有其他有用的信息,如.git/config文件夹中可能含有access_token信息,从而可以访问这个用户的其他仓库。
SVN泄露
SVN(subversion)是源代码版本管理软件,造成SVN源代码漏洞的主要原因是管理员操作不规范将SVN隐藏文件夹暴露于外网环境,可以利用.svn/entries或wc.db文件获取服务器源码等信息。这里推荐两个工具:
GitHub - kost/dvcs-ripper: Rip web accessible (distributed) version control systems: SVN/GIT/HG…
描述
SVN(subversion)是程序员常用的源代码版本管理软件。一旦网站出现SVN漏洞,其危害远比SQL注入等其它常见网站漏洞更为致命,因为黑客获取到网站源代码后,一方面是掠夺了网站的技术知识资产,另一方面,黑客还可通过源代码分析其它安全漏洞,从而对网站服务器及用户数据造成持续威胁。更严重的问题在于,SVN产生的 .svn目录下还包含了以 .svn-base结尾的源代码文件副本(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录),如果服务器没有对此类后缀做解析,黑客则可以直接获得文件源代码。
具体来说
- 在使用SVN管理本地代码过程中,会自动生成一个隐藏文件夹,其中包含重要的源代码信息。但一些网站管理员在发布代码时,不愿意使用‘导出’功能,而是直接复制代码文件夹到WEB服务器上,这就使隐藏文件夹被暴露于外网环境,这使得渗透工程师可以借助其中包含版本信息追踪的网站文件,逐步摸清站点结构。
- 在服务器上布署代码时。如果是使用 svn checkout 功能来更新代码,而没有配置好目录访问权限,则会存在此漏洞。黑客利用此漏洞,可以下载整套网站的源代码。
- .svn目录(隐藏目录)使用 svn checkout后,项目目录下会生成隐藏的 .svn文件夹(Linux上用 ls命令看不到,要用 ls -al命令)。svn1.6及以前版本会在项目的每个文件夹下都生成一个 .svn文件夹,里面包含了所有文件的备份,文件名为 .svn/text-base/文件名 .svn-base。svn1.7及以后版本则只在项目根目录生成一个 .svn文件夹,里面的 pristine文件夹里包含了整个项目的所有文件备份。
CTFhub SVN泄露
先用dirsearch扫出来
dvcs-ripper再扫
提示flag在旧版本ls -a
进入.svn
HG泄露
在初始化项目时,HG会在当前文件夹下创建一个.hg隐藏文件夹,其中包含代码和分支修改记录等信息。这里推荐工具:
GitHub - kost/dvcs-ripper: Rip web accessible (distributed) version control systems: SVN/GIT/HG…
总结经验
不论是.git这些隐藏文件,还是实战中的admin之类的敏感后台文件夹,其关键在于字典的强大,读者可以在某些工具的基础上进行二次开发,以满足自己需要。这里推荐一个开源的目录扫描工具:
GitHub - maurosoria/dirsearch: Web path scanner
CTF线上比赛往往会有重定向一类问题。例如,只要访问.git,便会返回403,此时试探着访问.git/config,如果有文件内容返回,就说明存在git泄露,反之,一般不存在。而在SVN泄露中,一般是在entries中爬取源代码,但有时会出现entries为空的情况,这时注意wc.db文件存在与否,便可通过其中的checksum在pristine文件夹中获取源代码。
robots.txt
robots协议也称爬虫协议、爬虫规则等,是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,而搜索引擎则通过读取robots.txt文件来识别这个页面是否允许被抓取。简单来说就是网站里面放了robots.txt,来对爬虫说,我的网站这些路径不允许爬取。但 robots协议没有强制执行力,可以手动在网站域名后面输入robots.txt。
:::tips
例:某ctf 题目不允许爬取/admin/目录,不允许爬取flag.php,不允许爬取www.tar.gz
User-agent:Disallow:/admin/ Disallow:/flag.php Disallow:/www.tar.gz
:::
vim备份文件
vim是目前运用得最多的Linux编辑器,当用户在编辑文件但意外退出时(如通过SSH连接到服务器时,在用vim编辑文件的过程中可能遇到因为网速不够导致的命令行卡死而意外退出的情况),会在当前目录下生成一个备份文件,文件名格式为: .swp
.swp是vi编辑器异常退出,而产生的一个文件比如编辑admin.php异常退出会产生一个admin.php.swp。
利用方法:如果可以将admin.php.swp下载下来,删掉.swp可以得到admin.php源文件。
针对SWP备份文件,我们可以用“vim-r”命令恢复文件的内容。这里先模拟执行“vim flag”命令,随后直接关闭客户端,当前目录下会生成一个.flag.swp文件。恢复SWP备份文件的办法是,先在当前目录下创建一个flag文件,再使用“vim-r flag”命令,即可得到意外退出时编辑的内容
CTFhub vim缓存
或者vim -r .index.php.swp回复文件
DS_Store文件泄漏
.DS_Store是Mac OS保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于Windows的desktop.ini。 其删除以后的副作用就是这些信息的失去。
和别人交换文件(或你做的网页需要上传的时候)应该把 .DS_Store 文件删除比较妥当,因为里面包含了一些你不一定希望别人看见的信息。
尤其是网站,通过 .DS_Store 可以知道这个目录里面所有文件的清单,很多时候这是一个不希望出现的问题。
由于开发/设计人员在发布代码时未删除文件夹中隐藏的.DS_store,可能造成文件目录结构泄漏、源代码文件等敏感信息的泄露。
ds_store_exp工具
GitHub - lijiejie/ds_store_exp: A .DS_Store file disclosure exploit. It parses .DS_Store file and downloads files recursively.
CTFhub .DS_Store
扫文件
用工具下载
总结经验
在CTF线上比赛的过程中,出题人往往会在线运维题目,有时会因为各种情况导致SWP备份文件的生成,所以读者在比赛过程中可以编写实时监控脚本,对题目服务进行监控。
vim在第一次意外退出时生成的备份文件为*.swp,第二次意外退出时的为*.swo,第三次退出时的为*.swn,以此类推。vim的官方手册中还有*.un.文件名.swp类型的备份文件。
另外,在实际环境中,网站的备份往往可能是网站域名的压缩包。
目录遍历
什么是目录遍历?
Directory traversal (also known as file path traversal) is a web security vulnerability that allows an attacker to read arbitrary files on the server that is running an application. This might include application code and data, credentials for back-end systems, and sensitive operating system files. In some cases, an attacker might be able to write to arbitrary files on the server, allowing them to modify application data or behavior, and ultimately take full control of the server.
目录遍历(也称为文件路径遍历)是一种网络安全漏洞,允许攻击者读取运行应用程序的服务器上的任意文件。这可能包括应用程序代码和数据、后端系统的凭据以及敏感的操作系统文件。在某些情况下,攻击者可能能够写入服务器上的任意文件,从而允许他们修改应用程序数据或行为,并最终完全控制服务器。
目录遍历的漏洞通过../../../这样的形式来进行目录读取服务器中的文件,../../../../越多多好,因为在终端中,../是返回上一级目录,到根目录使用../会返回当前页面。
一般发现目录遍历的漏洞的探针,也就是测试的时候往往是使用这样的payload[http://www.xxxx.com/xxx.php?page=../../../../../../../../../../../../../etc/passwd](http://www.xxxx.com/xxx.php?page=../../../../../../../../../../../../../etc/passwd)
一些绕过方式
加密参数传递的数据
有的网站程序传递参数后会进行base64加密(当然也会有其他加密),导致我们传递的参数无法解析,所以就无法利用目录遍历,而绕过方式也很简单,就是先对参数进行base64加密后再进行传参。如:?page=bTByZS50eHQ=
编码绕过
进行传参时将参数进行编码,实现绕过,比如URL编码。?page=%6D%30%72%65%2E%74%78%74
目录限定绕过
有些Web应用程序是通过限定目录权限来分离的。可以使用一些特殊的符号来绕过。比如提交这样的`xxx.php?page=/../boot`。就可以直接跳转到硬盘目录下。
绕过文件后缀过滤
一些Web应用程序在读取文件前,会对提交的文件后缀进行检测,攻击者可以在文件名后放一个空字节的编码,来绕过这样的文件类型的检查。
比如:../../../../boot.ini%00.jpg
,Web应用程序使用的Api会允许字符串中包含空字符,当实际获取文件名时,则由系统的Api会直接截短,而解析为../../../../boot.ini
在类Unix的系统中也可以使用Url编码的换行符,例如:../../../etc/passwd%0a.jpg
如果文件系统在获取含有换行符的文件名,会截短为文件名。也可以尝试%20,例如: ../../../index.php%20
绕过来路验证
Http Referer : HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的在一些Web应用程序中,会有对提交参数的来路进行判断的方法,而绕过的方法可以尝试通过在网站留言或者交互的地方提交Url再点击或者直接修改Http Referer即可,这主要是原因Http Referer是由客户端浏览器发送的,服务器是无法控制的,而将此变量当作一个值得信任源是错误的。
PortSwigger例题
What is directory traversal, and how to prevent it? | Web Security Academy
Lab: File path traversal, simple case
payload:image?filename=../../../etc/passwd
Lab: File path traversal, traversal sequences blocked with absolute path bypass
payload:image?filename=/etc/passwd
Lab: File path traversal, traversal sequences stripped non-recursively
payload:image?filename=....//....//....//etc/passwd
Lab: File path traversal, traversal sequences stripped with superfluous URL-decode
payload:image?filename=%252e%252e%252f%252e%252e%252f%252e%252e%252f/etc/passwd
Lab: File path traversal, validation of start of path
payload:/var/www/images/../../../etc/passwd
Lab: File path traversal, validation of file extension with null byte bypass
payload:../../../etc/passwd%00.png
How to prevent a directory traversal attack
The most effective way to prevent file path traversal vulnerabilities is to avoid passing user-supplied input to filesystem APIs altogether. Many application functions that do this can be rewritten to deliver the same behavior in a safer way.
If it is considered unavoidable to pass user-supplied input to filesystem APIs, then two layers of defense should be used together to prevent attacks:
- The application should validate the user input before processing it. Ideally, the validation should compare against a whitelist of permitted values. If that isn’t possible for the required functionality, then the validation should verify that the input contains only permitted content, such as purely alphanumeric characters.
- After validating the supplied input, the application should append the input to the base directory and use a platform filesystem API to canonicalize the path. It should verify that the canonicalized path starts with the expected base directory.
Below is an example of some simple Java code to validate the canonical path of a file based on user input:
File file = new File(BASE_DIRECTORY, userInput); |