也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大
少走了弯路,也就错过了风景,无论如何,感谢经历
转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球
感谢大家一直以来对我CSDN博客的关注和支持,但是我决定不再在这里发布新文章了。为了给大家提供更好的服务和更深入的交流,我开设了一个知识星球,内部将会提供更深入、更实用的技术文章,这些文章将更有价值,并且能够帮助你更好地解决实际问题。期待你加入我的知识星球,让我们一起成长和进步
0x01 view_source Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数:一星
题目来源: Cyberpeace-n3k0
题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。
题目分析:从题目,我们可以看到X老师给小宁这个靓仔(叼毛)一个任务,就是去某网站查看网页的源代码,但是进入该网站后发现无法从鼠标右键里面点击查看源代码。
个人感觉,解这道题的Flag 就在网页的源代码里面藏着,那么除了右键点击查看页面源代码外,还可以使用哪些方法查看页面源代码?
一些能想到的解题方法,供大家参考:
- F12 开发者工具查看源代码
- 快捷键或输入view-source
- BurpSuite 抓包获得网页源代码
- 禁用JS插件后,查看源代码
- html 页面存储到本地查看
备注: 大家进入攻防世界,注册账号并登陆后,点击页面左上方一栏的【答题】标签下的【Web】标签页开始竞赛吧,该Web 方向题目分【新手练习区】和【高手进阶区】
1.1 F12 开发者工具查看源代码
1)用firefox打开页面,摁下F12(查看整个DOM结构),打开查看器可以得到flag
下方有个被注释的一串字符串,找到flag
2)或用chrome打开页面,摁下F12(查看整个DOM结构),在Elements栏可以得到flagF12
下方有个被注释的一串字符串,找到flag
1.2 快捷键或输入view-source
1)URL地址栏加view-source: 或 Ctrl+u(查看源码快捷键)
下方有个被注释的一串字符串,找到flag
1.3 Burp Suite 抓包获得网页源代码
1)开启监听抓包,然后去Target的Response 或开启抓包后右击一下将数据包放到Response(重放)里面查看
下方有个被注释的一串字符串,找到flag
1.4 禁用JS插件后,查看源代码
网页鼠标右键失效一般都是JS代码禁用了右键菜单,利用插件禁用JS代码即可。
禁用js代码右键查看源代码即可得到flag
禁用js操作步骤:
首先,在地址栏中输入 “about:config”
然后,在搜索框中输入 “javascript.enabled”,将其设置为false返回题目
1.5 html 页面存储到本地查看
将页面保存到本地,用记事本打开即可获得Flag
- 不同浏览器将html 页面保存到本地会不同,但大同小异,这里以Firefox 为例,操作如下图:
保存到本地后用记事本打开
成功获得flag
0x02 robots Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧。
题目分析:装X老师上课讲了Robots协议,但貌似小宁这个靓仔(叼毛)上课居然打瞌睡去了,不晓得是不是昨晚害羞害羞去咯(自己脑补场景)!回归正题,个人理解robots.txt 文件就是告诉搜索引擎网站中哪些东西你可以访问,哪些你不可以访问。因为搜索蜘蛛访问一个站点时,会检查该站点是否存在robots.txt文件,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围。如果该文件不存在,则所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面面。
2.1 解题思路
1)访问题目给出的URL地址:http://111.198.29.45:53873/ ,发现一片空白,啥都没有
2)右键鼠标查看源代码,给出一点点提示,就是那段注释的话,说Flag 不在这里
3)页面源代码找不到Flag,那么我们再看看题目,解题关键点是Robots 协议,那么直接回到题目给出的URL掏出机关枪,在URL地址后面加上 /robots.txt
URL地址后面加上 /robots.txt 如下图
注:打开页面后,看似好像也没什么鬼啊,到底是什么鬼?我们想要的Flag 到底在哪里?
- 发现一个 disallow 里面有个 PHP 文件, disallow 声明此文件不可爬取?不可爬取并不一定代表我们人工不能访问(这只是一种道德规范,有一种此地无银三百两的意味,淫笑 _ !),我们尝试访问一下这个PHP文件试试。
4)在根目录下,添加读取robots.txt 文件时知道的PHP文件(f1ag_1s_h3re.php)名,即可得到Flag,如下图:
注:解这道题的思路不局限于此,例如你可以通过扫目录获得Flag,工具例如御剑、dirsearch等工具
0x03 backup Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧!
本题分析:装X老师忘记删除备份文件,他让小宁这个靓仔(叼毛)去把备份文件找出来,见题知意,分明就是考察我们对backup 的理解嘛!
如下是对backup 的含义:
- 脑中经常会看到名为backup的文件夹,那么backup到底是什么意思呢?
- 相信平时大家在使用电脑的时候,经常会看到一个名为backup的文件夹
- backup文件夹其实就是备份文件夹,这个文件夹一般出现在系统盘之外的盘中,如果你曾对磁盘进行过备份的话,备份文件就会出现在这个文件夹中了
- backup文件夹是很有用的,如果你的电脑想要重装系统的话,肯定是需要数据备份的,这时候备份文件就会进入backup文件夹了,大家可以在这里查找备份
- 如果你不是很清楚backup文件夹中都有什么内容的话,最好不要直接删除,否则会导致重要文件丢失,如果你不需要这些备份文件的话,那就可以直接删除了
例如:一个开发者要编辑config.php文件,为了避免修改后出现问题,那么他首先会复制该文件。复制文件的命名也差不多时能让人见名就能关联到这个时原文件
常见的备份文件后缀名有:".git"、".svn"、".swp"、".~"、".bak"、".bash_history"、".bkf"
config.php——>config.php.bak
config.php——>config.php.git
config.php——>config.php.bkf
config.php——>config.php.old
config.php——>config.php.temp
3.1 解题思路
1)我们打开给解题URL地址,发现只给一段文字?
2)F12 一下,去看看页面源代码里面是否会有点有用的信息,有点失望,跟之前打开页面时一样的提示语,自己摸摸了头,想了一下该题目是叫backup,会不会是要考验我们常用备份文件扩展名方面的知识?
注:常见的备份文件后缀名有:".git"、".svn"、".swp"、".~"、".bak"、".bash_history"、".bkf"
3)想到就去做,自己尝试在URL后面,依次输入常见的文件备份扩展名,惊喜出现了,尝试到“index.php.bak” 时,突然左下方出现一个index.php.bak 的文件,(●’◡’●)
4)用notepad++ 打开 index.php.bak 文件
成功获得Flag
或用扫描工具,如下图
0x04 Cookie Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
Cookie是当主机访问Web服务器时,由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理。
简单的说,Cookie就是服务端为了让用户不在每次访问需要登录的页面都要登录一次,而生成的一种证明身份的数据。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
Cookie中常常包含了一些敏感消息:用户名、计算机名、使用的浏览器和曾经访问的网站等,当得到没有过期的cookie时就能绕过登录甚至做更多的事。
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:‘这是夹心饼干的意思吗?
题目分析:装X老师,让小宁去找Cookie,个人猜测我们想要的Flag就在Cookie里面
http的headers中包含的部分为:
- Host:请求的域名或者ip
- Content-Length:用于表示http消息实体的传输长度(即表示实体长度又表示传输长度,如果实体长度和传输长度不一致则不能有Content-Length),即有tansfer-encoding时,Content-Length将被忽略
- Accept:用于指定客户端接收哪些类型的信息,此例子表示希望接收html文本
- User-Agent:简称UA,其中包含一些用户信息,使用的操作系统及版本,浏览器及版本等
- Content-Type:互联网媒体类型,用来表示在具体请求中的媒体类型信息
- 类型格式:
type/subtype(;parameter)? type
- 主类型,任意的字符串,如text,如果是*号代表所有;
- subtype 子类型,任意的字符串,如html,如果是*号代表所有;
- parameter 可选,一些参数,如Accept请求头的q参数, Content-Type的 charset参数
- 常见的媒体格式类型如下:
text/html
: HTML格式text/plain
:纯文本格式text/xml
: XML格式image/gif
:gif图片格式image/jpeg
:jpg图片格式image/png
:png图片格式- 以application开头的媒体格式类型:
application/xhtml+xml
:XHTML格式application/xml
: XML数据格式a pplication/atom+xml
:Atom XML聚合格式application/json
: JSON数据格式a pplication/pdf
:pdf格式a pplication/msword
: Word文档格式application/octet-stream
: 二进制流数据(如常见的文件下载)application/x-www-form-urlencoded
:<form encType="">
中默认的encType,form表单数据被编码为key/value
格式发送到服务器(表单默认的提交数据的格式)
- 类型格式:
- Referer: 当浏览器向web服务器发送请求时一般会带上referer,告诉服务器从哪个页面来,基于此可获取一些信息做处理
- Accept-Encoding: 浏览器发给服务器,声明服务器支持的编码类型
- Accept-Language: 允许客户端声明自己支持的语言类型
- Cookie: 存放在本地文件中用于保存一些用户信息
4.1 插件工具HTTP Headers 查看Cookie
Live HTTP Headers是一款可以帮助用户查看当前使用Chrome打开的所有网页的状态,在Chrome安装了Live HTTP Headers插件以后,用户使用Chrome打开某个网站以后,就可以使用Live HTTP Headers插件来立即查看当前网页中的HTTP Header信息,在这些信息中会包含当前网页的加载情况,比如资源的访问状态:200、301、404等,通过对这些信息的分析就可以很好地调试当前的网页,给网站的开发者带来便利
4.2 F12 开发者工具查看Cookie
1)访问解题给出的URL ,打开F12 后重新刷新一下页面,在Network 一栏下查看消息头,发现有个Cookie 字段,字段值为look-here=cookie.php
2)访问cookie.php,再次打开F12 重新刷新一下页面,还是在Network 下查看,这次我们在消息头里面,发现了我们想要的Flag
4.3 伪代码查看 cookie
1)F12 开发者工具Console下输入 javascript:alert(document.cookie) 查看cookie
2)访问cookie.php,再次打开F12 重新刷新一下页面,还是在Network 下查看,这次我们在消息头里面,发现了我们想要的Flag
4.4 Burp Suite 查看Cookie
1)BurpSuite 抓包,可看到名为look-here的cookie的值为cookie.php
2)访问cookie.php 页面,BurpSuite 抓包,我们放到Repeater 里重放
3)重放,点击Go,成功得到Flag
0x05 weak_auth Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:小宁写了一个登陆验证页面,随手就设了一个密码。
5.1 解题思路
1)什么都不输入,先Fuzz 尝试登陆看看
2)点击【login】按钮,页面跳转到check.php 页面,并弹窗提示:please login as admin!(请以管理员身份登录)
我们再打开check.php 的页面源代码看看会不会有什么线索,发现在javascript alert 那一行的最后有注释的信息,提示:maybe you need a dictionary!(也许你需要一本字典!)
注:这提示很明显了,那么咋们就爆破嘛!盘它
3)用Burp Suite 截下登录的数据包,把数据包发送到intruder爆破,这里我首先用的是BurpSuite 自带的字典爆破,发现太难了,没爆出来,看来是我字典太烂了,换个字典换个姿势再来一次
推荐一个爆破字典GitHub下载链接:
https://github.com/rootphantomer/Blasting_dictionary
下载到本地并解压即可
好啦,前面都是前戏,前戏做足了,那么咋们开始盘它咯,坐好咯,要发车咯!(#^.^#)
4)再次用Burp Suite 截下登录的数据包,把数据包发送到intruder爆破
5)先清除一下变量Clear$
,然后设置爆破点为password,那么我们选中密码参数字段的值,点击Add$
6)最后去Paylods 标签栏 Payload Option [Simple list] 模块下点击【Load】按钮,选择字典添加即可。我这里选择的是常用密码
7)开始爆破,成功爆破出admin 账号的密码:123456
8)开始攻击,查看响应包列表,发现密码为123456时,响应包的长度和别的不一样,点进去查看响应包,获得Flag
9)浏览器页面,我们也尝试一下刚刚破解密码来登录,看看能不能获得Flag
10)登录成功,页面跳转到check.php 后显示出Flag
0x06 simple_php Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码
php中有两种比较符号:
=== 会同时比较字符串的值和类型
== 会先将字符串换成相同类型,再作比较,属于弱类型比较
https://www.php.net/manual/zh/types.comparisons.php
数字和字符混合的字符串转换为整数后只保留数字
<?php
$str="123.9abc";
$int=intval($str); //转换后数值:123
$float=floatval($str); //转换后数值:123.9
$str=strval($float); //转换后数值:"123.9"
?>
6.1 解题思路
1)通过阅读代码发现需要同时满足 a==0 且 if a 为真,b 不是数字且 b>1234 才会返回 flag
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
2)php中的弱类型比较会使’abc’ == 0为真,所以输入a=abc时,可得到flag1。(a可换成任意字符,例如:"b"、"c"、"d"、"、"
等字符)
3)is_numeric() 函数会判断如果是数字和数字字符串则返回 TRUE,否则返回 FALSE,且php中弱类型比较时,会使(‘1234a’ == 1234)为真,所以应该输入a=a&b=1235a
用&隔开a和b之间的参数
- URL中易出现的特殊字符
特殊含义 | 十六进制 |
---|---|
+ 表示空格(在URL中不能使用空格) | %2B |
/ 分隔目录和子目录 | %2F |
? 分隔实际的URL和参数 | %3F |
# 表示书签 | %23 |
& URL中指定的参数间的分隔符 | %26 |
= URL中指定的参数的值 | %3D |
成功得到Flag
0x07 get_post Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?
题目分析:从题目中可以看出装X老师想让小宁这靓仔(叼毛),熟悉常见的HTTP协议,HTTP协议有八种,但常见的两种貌似只有Get和Post,那么可以想象的到获得Flag 的方法,就在这两种请求方式里。
HTTP协议中共定义了八种方法或者叫“动作”来表明对Request-URI指定的资源的不同操作方式,具体介绍如下:
- GET:向特定的资源发出请求
- POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改
- OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性
- HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息
- PUT:向指定资源位置上传其最新内容
- DELETE:请求服务器删除Request-URI所标识的资源
- TRACE:回显服务器收到的请求,主要用于测试或诊断
- CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
用 GET 给后端传参的方法是:在?后跟变量名字,不同的变量之间用&隔开,举例:
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1
7.1 解题思路
1)根据提示,先Get 方式提交一个名为a值为1的变量, 在 url 后添加/?a=1 ,点击Execute 按钮,即可发送 get 请求
2)然后再以POST方式,提交一个名为b值为2的变量。打开HackBar,复制刚刚Get 的URL,勾选Post data,填入b=2,点击Execute 按钮,即可发送 POST 请求
注:切记,一定要在HackBar 里面勾选Post data
成功获得Flag
0x08 xff_referer Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:X老师告诉小宁其实xff和referer是可以伪造的。
题目分析:装X老师,意图很明显就是像让小宁这个靓仔(叼毛)了解xff和referer 相关的知识点。
- X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项
- HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的
X-Forwarded-For(XFF)维基百科:
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在HTTP头字段标准化草案中正式提出。
当今多数缓存服务器的用户为大型ISP,为了通过缓存的方式来降低他们的外部带宽,他们常常通过鼓励或强制用户使用代理服务器来接入互联网。有些情况下,这些代理服务器是透明代理,用户甚至不知道自己正在使用代理上网。
如果没有XFF或者另外一种相似的技术,所有通过代理服务器的连接只会显示代理服务器的IP地址,而非连接发起的原始IP地址,这样的代理服务器实际上充当了匿名服务提供者的角色,如果连接的原始IP地址不可得,恶意访问的检测与预防的难度将大大增加。XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性,因此,XFF的有效使用应该保证代理服务器是可信的,比如可以通过创建可信服务器白名单的方式。
简单地说,xff是告诉服务器当前请求者的最终ip的http请求头字段
通常可以直接通过修改http头中的X-Forwarded-For字段来仿造请求的最终ip
Referer 维基百科:
HTTP来源地址(referer,或HTTP referer)
是HTTP表头的一个字段,用来表示从哪儿链接到当前的网页,采用的格式是URL。换句话说,借着HTTP来源地址,当前的网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。
简单的讲,referer就是告诉服务器当前访问者是从哪个url地址跳转到自己的,跟xff一样,referer也可直接修改
8.1 解题思路
8.1.1 Burp Suite 修改数据包获得Flag
1)BurpSuite 修改数据包获得Flag
BurpSuite 配置的代理
2)BurpSuite 开启监听,刷新当前浏览页面,在BurpSuite 的Raw下添加X-Forwarded-For(XFF)字段
伪造HTTP请求头中X-Forwarded-For
3)BurpSuite 放包(Forward)后,浏览页面字体发生变化,给出相关提示:“必须来自https://www.google.com”
4)根据提示,我们再次刷新浏览器页面,在BurpSuite 的Raw下添加X-Forwarded-For和Referer 字段
- 伪造HTTP请求头中X-Forwarded-For
- 伪造HTTP请求头中Referer
X-Forwarded-For: 123.123.123.123
Referer: https://www.google.com
5)再次我们放包(Forward),浏览页面发生改变,得到了我们梦寐以求,日思夜想的Flag
成功获得Flag
cyberpeace{ad1b9c31a98ecd7d33ce7b28c7667994}
8.1.2 ModHeader 插件工具获得Flag
ModHeader(chrome http请求头添加插件)是一款可以安装在谷歌浏览器上使用的http请求头添加插件,主要功能是为网页添加、修改或删除请求头和响应头,并可以为网页使用多个不同的配置文件来配置请求头,另外也可以将之前使用过的http请求头导入进该插件的配置中,或将正在使用的请求头导出以在别的地方使用,非常实用,需要的朋友欢迎前来下载使用!
使用谷歌浏览器的ModHeader 插件工具来伪造X-Forwarded-For(XFF)和Referer
1)首先打ModHeader 工具,添加X-Forwarded-For(XFF)字段
伪造HTTP请求头中X-Forwarded-For:
X-Forwarded-For: 123.123.123.123
2)添加X-Forwarded-For(XFF)字段成功后,刷新当前页面,当前浏览页面,给出相关提示:“必须来自https://www.google.com”
3)提示,我们需要额外添加一个Referer 字段
首先,打开ModHeader 工具,点击弹窗右上角的 + 号,选择添加 “Request Heders”
4)ModHeader 工具新增一行Request Headers 后,在新增的一行中填写Referer 字段
- 伪造HTTP请求头中X-Forwarded-For
- 伪造HTTP请求头中Referer
X-Forwarded-For: 123.123.123.123
Referer: https://www.google.com
5)重新刷新当前浏览页面,成功获得Flag
cyberpeace{ad1b9c31a98ecd7d33ce7b28c7667994}
0x09 webshell Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:小宁,百度了php一句话,觉着很有意思,并且把它放在index.php里
webshell 维基百科:
webshell(分类为远程访问木马)是作为一个基于网络的实现的网络安全威胁shell概念。 Webshell可以上传到Web服务器,以允许远程访问Web服务器,例如Web服务器的文件系统。
Webshell的独特之处在于它使用户能够通过充当命令行界面的Web浏览器访问Web服务器。用户可以使用Web浏览器通过万维网访问远程计算机在任何类型的系统上,无论是台式计算机还是带有Web浏览器的手机,都可以在远程系统上执行任务。主机或客户端都不需要命令行环境。
简单的说webshell就是web后门,比如php,asp木马后门。黑客在入侵了一个网站后,常常在将这些 asp或php木马后门文件放置在网站服务器的web目录中,与正常的网页文件混在一起。然后就可以用web的方式,通过asp或php木马后门控制网站服务器,包括上传下载文件、查看数据库、执行任意程序命令等。
Web shell通过Web应用程序中的漏洞或弱服务器安全配置上传,包括以下内容:
- SQL注入
- 应用程序和服务中的漏洞(例如NGINX等Web服务器软件或WordPress等内容管理系统应用程序)
- 文件处理和上传漏洞(例如限制可上传的文件类型)
- 远程文件包含(RFI)和本地文件包含(LFI)漏洞
- 远程代码执行
- 暴露的管理界面
- 跨站脚本
php 一句话木马:
<?php @eval($_POST[value]); ?>
asp 一句话木马:
<%eval request ("value")%>
或
<% execute(request("value")) %>
aspx 一句话木马:
<%@ Page Language="Jscript" %>
或
<% eval(Request.Item["value"]) %>
9.1 解题思路
1)访问解题的URL,直接提示你会使用Webshell 嘛?太明显了,而且还把php一句话木马给显示出来,不等着你盘它嘛?
2)恭敬不如从命,直接上菜刀或蚁剑连接,此处用蚁剑链接:
注:蚁剑加载器仅在 https://github.com/AntSwordProject/AntSword-Loader 发布,下载后请第一时间校验 md5 值
或中国菜刀
或冰蝎进行连接
https://github.com/rebeyond/Behinder
当然,也可以使用hackbar,使用post方式传递shell=system(‘cat flag.txt’); 获得flag
PS:这种我不是特别推荐,都知道shell的前提下,何必这么麻烦了,影响自己的效率。
3)首先看看当前shell下有哪些文件,发现存在flag.txt
查看flag.txt 获得Flag
4)连接后在网站目录下发现了flag.txt文件,下载flag.txt 文件到本地
5)用Notepad++ 查看文件可获得flag
0x10 command_execution Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:小宁写了个ping功能,但没有写waf,X老师告诉她这是非常危险的,你知道为什么吗?
常见命令拼接符:
• && :执行两个命令,若前面出错,后面不会执行
• & : 执行两个命令,若前面出错,后面还是会执行
• || : 执行正确的那个命令,前面的失败,后面也会执行,前面成功,后面不会执行
• | : 只会执行后面的命令
常见连接符 | 举例 | 效果 |
---|---|---|
; | A;B | 先执行A,再执行B |
& | A&B | 简单拼接,A B之间无制约关系 |
| | A|B | 显示B的执行结果 |
&& | A&&B | A执行成功,然后才会执行B |
|| | A||B | A执行失败,然后才会执行B |
- 命令执行漏洞是什么?
当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。
该题中,直接把用户输入的参数不经过过滤直接放在ping命令之后,而恶意攻击者可以在输入的参数中用&&或|或||截断,而执行下一个恶意命令
注:%0A 是换行符的url编码形式,有的时候可以用来绕过对以上常见的连接符过滤了的情况
10.1 解题思路
1)打开解题URL地址,给出如下图的内容,貌似是一个具有Ping 功能的页面
2)那么如下,输入127.0.0.1,Ping 一下本地的IP 看看能不能成功执行,并查看命令执行结果
如上图,发现能成功返回信息,而且开局就提示过没有WAF,此时大家应该也联想到能否使用命令拼接的方式来执行其它命令的思路了吧?
3)咋们打开浏览器,在文本框内输入127.0.0.1 | find / -name "flag*" (将 | 替换成 & 或 && 都可以)
,查找flag所在位置,尝试一下看看能否成功
4)执行成功,得到flag.txt存放的地址,我们如下,输入127.0.0.1 | cat /home/flag.txt
获取Flag
cyberpeace{6d947e9ef8352104082e9d173396ae60}
10.1.1 HackBar 工具POST提交方式获得Flag
首先获取文本框的参数的值是多少,然后再用POST 提交方式一步步获得Flag,我这里是直接输入了Flag 的地址直接获取的,你也可以一步步按照上述的操作步骤在HackBar 里面用POST 方式来查询试试
执行成功,获得Flag
或用Burp 抓包放到重放里,慢慢调试获得Flag的地址,或自己写一个import request 脚本去跑获得Flag的地址
0x11 simple_js Write Up
XCTF Web 练习题地址:https://adworld.xctf.org.cn/
难度系数: 一星
题目来源: root-me
题目描述:小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )
定义和用法
fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
注:该方法是 String 的静态方法,字符串中的每个字符都由单独的 Unicode 数字编码指定。使用语法: String.fromCharCode()
实例,将 Unicode 编码转为一个字符:
var n = String.fromCharCode(65);
n 输出结果:A
11.1 解题思路
1)按照页面回显结果和源码判断,不论输入任何密码,中都会跳转到错误密码
2)输入任意密码,点击确定,弹出提示:FAUX PASSWORD HAHA
注:假密码~!哈哈
3)修改HTML代码,将右击弹窗里选择Edit as HTML
4)替换dechiffre里的字符串放到 var pas 里
5)编辑文本将代码修改,用下方的可疑字符串代替函数中的常量
6)替换成功后,将当前HTML页面另存到本地
7)保存到本地后,用浏览器打开
8)打开后,弹窗出出啦的就是Flag
11.2 解题拆分步骤分析
1)在线HTML编辑地址,方便大家手工调试:https://www.runoob.com/runcode
2)该HTML的JS 代码如下:
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
3)去除无用变量:
function dechiffre() {
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab2 = pass.split(',');
var i, n, p = "";
n = tab2.length;
for (i = 0; i < n; i++) {
p += String.fromCharCode(tab2[i]);
if (i == 5) break;
}
for (i = 0; i < n; i++) {
if (i > 5 && i < n - 1) p += String.fromCharCode(tab2[i]);
}
p += String.fromCharCode(tab2[17]);
return p;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
4)合并两个循环:
function dechiffre() {
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab2 = pass.split(',');
var i;
var p = "";
for (i = 0; i < tab2.length - 1; i++) {
p += String.fromCharCode(tab2[i]);
}
p += String.fromCharCode(tab2[17]);
return p;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
5)末尾并入循环:
function dechiffre() {
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab2 = pass.split(',');
var i;
var p = "";
for (i = 0; i < tab2.length; i++) {
p += String.fromCharCode(tab2[i]);
}
return p;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
6)就逻辑上可见它只是将内容为逗号分隔的数字的字符串转成相应编码的字符串,将代码修改,用下方的可疑字符串代替函数中的常量,得到的整个网页代码是:
function dechiffre() {
var pass = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30";
var tab2 = pass.split(',');
var i;
var p = "";
for (i = 0; i < tab2.length; i++) {
p += String.fromCharCode(tab2[i]);
}
return p;
}
alert(dechiffre());
11.3 Python 脚本获得Flag
1)按照页面回显结果和源码判断,不论输入任何密码,中都会跳转到错误密码
2)输入任意密码,点击确定,弹出提示:FAUX PASSWORD HAHA
注:假密码~!哈哈
3)而真正的密码在这里,不在常量里面
4)通过观察JS代码,判断编码方式为 base16,写python脚本进行转码,代码如下
string = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
a = string.split(",")
b = ""
for i in a:
i = chr(int(i))
print(i)
b+=i
print("Flag:",b)
运行结果如下:
或
>>> a = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
>>> print(a)
55,56,54,79,115,69,114,116,107,49,50
>>> a = [55,56,54,79,115,69,114,116,107,49,50]
>>> for i in a:
... print(chr(i),end='')
...
786OsErtk12>>>
运行结果如下:
0x12 disabled_button Write Up
难度系数: 一星
题目来源: Cyberpeace-n3k0
题目描述:X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢?
定义和用法:
- disabled 属性规定禁用按钮
- 被禁用的按钮既不可用,也不可点击
- 可以设置 disabled 属性,直到满足某些条件(比如选择一个复选框),才恢复用户对该按钮的使用。然后,可以使用 JavaScript 来清除 disabled 属性,以使文本区变为可用状态
属性值:
值 | 描述 |
---|---|
disabled | 规定应该禁用该按钮 |
例子:
<html>
<body>
<button type="button" disabled="disabled">不可点击的按钮</button>
</body>
</html>
- 按钮表单里面有disabled 属性,按钮是置灰状态,不可点击
- 按钮表单里面无disabled 属性,按钮是可点击状态
12.1 F12 工具获得Flag
1)进入解题的URL,发现按钮是置灰状态,无法点击。我们打开开发者工具(快捷键 F12),在查看器窗口(Elements)审查元素,发现存在disabled=“” 字段或 disabled 字段 (我这里用的是谷歌浏览器,所以删掉disabled字段即可,如果是火狐删除disabled=“” 即可,如下图)
- 谷歌浏览器
- 火狐浏览器
2)将disabled=“” 字段或 disabled 字段删除后,按钮变成可按状态,不处于置灰状态,按下后得到flag,操作如下
编辑html 内容
删掉disabled 属性
disabled 属性规定应该禁用的 元素。被禁用的 input 元素是无法使用和无法点击的。 删除源码中的disable属性,按钮即可点击,然后得到Flag
12.2 HackBar POST 提交获得Flag
1)审计from表单代码,使用HackBar,用post方式传递auth=flag,同样可以获得Flag
2)打开HackBar 勾选Post data ,输入auth=flag 后,点击Execute 按钮,页面成功回显Flag
12.3 BurpSuite 修改HTML 内容获得Flag
1、开启代理拦截,直接修改Response值
1)开启监听后,在Raw一栏下右击弹窗中选择Do intercept——>点击 Response to this request 开启代理拦截
2)BurpSuite 删掉disabled 属性,点击Forward 放行
3)然后返回浏览器,发现按钮变为可点击状态
4)点击Flag 按钮后,成功获得Flag
2、使用自动代理转发,如下图
你以为你有很多路可以选择,其实你只有一条路可以走