公开课基础演练靶场 第三章 burp抓包和CSRF伪造详细解题思路

猪骑士   ·   发表于 2018-09-04 10:18:50   ·   CTF&WP专版

       首先感谢专业1群里的桐镜i大佬。

       话不多说,又来到了“硕大”的传送门入口,按下按钮,一阵金光闪烁那个令人无法忘怀的网站又出现在了我的眼前。但是,与之前不同的是,如今的我已经知道了这个网站真正的后台管理员登录地址--admin123。于是,我直接将其添入了url地址栏,如下图。


       又是那个熟悉的登录页面,不过现在这个才是真的。于是我毫不犹豫地填入了信息,并点击了确定,如下图。


       当然,结果是错的!如下图。看过视频的人都知道,怎么可能这么简单嘛。那还是用老师上课教的知识来做吧。


       于是我重新来到了登录页面,在浏览器设置中配置了代理服务器ip为127.0.0.1,端口号为8080。然后打开了burp,并且将其进行了同样的配置,以便brup抓包,如下图。最后点击确定,好戏开场了。


       点击确定之后,我们发现页面并没有跳转到我们想去的页面,那是因为浏览器发送给服务端的请求包已经被burp截取了。我们打开burp,发现这个请求包的请求头中显示了很多信息。根据老师上课的讲述,我辨别出了第一行的get/http/1.1并没有向浏览器请求具体的资源,这一行的作用只是和服务端进行确认,当前通信协议的版本为http1.1。就好像人与人之间说话,首先要确定两者之间说的话是不是同一种,是否都能听懂一样。因此这一个请求包,没有必要对它进行修改,于是我直接点击了发送forward,如下图。


       点击之后,我们发现页面没有变化,但是抓取的请求包已经不一样了。首先第一行的传参方式变成了post,post方式一般都出现在表单提交,再看后面的资源名字,应该就是在向服务端提交填写的表单进行验证,如下图。因此这一个包,也没必要去修改,直接放行,发送!


       发送之后,还是没有看到页面的变化!但是burp又抓去了一个请求包,这个时候是以get方式去请求default.asp的资源,那么此时表单应该已经验证通过了。default顾名思义就是一个默认需要的资源,再结合之前已经看到过的那个出错了的页面,就发现此时的请求应该会返回一个页面了,并且页面中应该携带了一些默认的东西。为什么会联想到这些?因为,在前后端,有些命名方式其实是约定俗成的,比如一般网站的主页都是index命名,比如一个网站通用的css样式一般命名为base,一般经常用到的js文件命名为common等,当然也不是必须这样命名,也有不是这样的,但是大部分我见过的,学过的都类似。因此,我仍然直接点击了发送(其实是因为看过视频哈哈哈哈哈),如下图。


       我们终于看到了页面发生了变化--title变成了企业网站管理系统,而页面中也出现了一些元素和样式,但是仍然没有看到主体。此时,我们注意到burp抓取的包用get方式传了一些奇怪的信息,看上去好像是一些地区是中国之类的信息,看起来和我们要做的事情也无关,于是我大胆的放行了,如下图。


       好的,没有看到明显的变化,此时的请求包里请求的是LeftTree.asp。联想到之前的出错页面,应该就是在请求左边的那一列东西了,这样的话,当时报错的地方也不是左边,好像和错误也没有啥关系,继续放行!如下图(图中说显示右边的东西,其实是左边,是我打错了)。


       果然,左侧出现了导航栏区域。此时的请求包又请求了下一个资源--sysadmin_view!这个词就很扎眼了,就可能和刚才的错误有关了。但是我还是放行了,再看看效果,又不会爆炸,如下图。


       好的,成功报错!这就意味着刚才我放行的那个sysadmin_view.asp非常重要了。但是浏览器又在请求下一个包了,有参数是menu=top。再看看第一次出错时候的页面,是不是发现现在少了点东西,没错,少了那个大大的标题。于是我继续放行,注意我截图的时候已经不是第一次做题了,每次最好先清理浏览器缓存,并且每次请求的文件顺序可能会不一样,如下图。


       果然返回了完整的页面,并且浏览器不再请求资源,如下图。


       此时,结合老师上课教的知识,我就尝试着在请求这个sysadmin_view.asp资源的时候改变ip地址,以达到内网访问的效果。那么怎么样实现内网访问最简单呢?当然是本地访问,只需要将host和referer的ip改成一致就行了,如下图。


       我又失败了,谢谢。说好的成功呢???不过机智的我又发现了一些不同寻常的东西。页面中的提示信息里,说访问者的host的端口号为81,但是我明明在请求包里看到是8001,再看下面图片的源代码(前面的源代码主要是这样的思路:首先读取referer,如果为空则表示是从地址栏直接输入的地址,而不是正常请求得到的,那么报错;如果有值,接着读取host并且在前面拼接上http://,然后如果referer有冒号则意味着有端口号,那么读取端口号拼接在curl,然后再拼接上当前文件名)的倒数第六行的if语句,首先InstrRev这个函数是从字符串的右边开始找到首次出现“/”的位置,并返回从左便开始数的这个位置的索引值;而left函数是返回该字符串从左开始到这个索引值的字串;最后的lcase函数则是将大写转化为小写字母。所以这行代码的功能其实是比较curl--http://127.0.0.1:81/admin123和comeurl--http://127.0.0.1:8001/admin123是否一致,所以其实就是必须host的ip、port和referer的ip、port一致才行。那我难道要把referer的端口号也改成81吗?按照它的提示信息,好像确实是这样。如下图。


       说干就干,我又回去了!!然后根据上面的分析,把referer的port改成了81。发送吧火箭少年!!如下图。


       yes!成功了,拿到通关key实在是美滋滋--zkz{fuzz-666},填入flag吧。


       但是你以为这样就完了吗???你不觉得通关通得很莫名其妙吗?明明是8001端口,为什么会变成81端口?闹鬼吗?

       为此,我去专业1群里问了群里的大佬。其中桐镜i大佬给了我很多指点很信息,在此感谢桐镜i大佬。

       桐镜i大佬给了两个很关键的信息--

       1.在修改IP的时候,其实直接去掉host和referer的端口号,也是可以成功的,因为两者端口号为空但ip一致,在程序中是没有逻辑问题的,如下图,确实可以成功!



       2.更进一步,程序中只判断了host的ip、port和referer的ip、port是否一致,那么是不是任意ip和port只要两者保持一致就可以了呢?确实如此,如下图。



       所以到底是为啥呢?桐镜i大佬提出了一些观点,我觉得端口转发好像确实和这个很像,因为传参的端口8001和真正的端口81不一样。但是这个解释不了任意端口也可以的情况。所以实在是有点纠结,感觉知识量还是太少了。这个问题还是有待以后研究研究,真是令人绝望。

       到此结束。


打赏我,让我更有动力~

7 条回复   |  直到 2020-4-3 | 10437 次浏览

Tkb
发表于 2019-10-17

flag是后面的zkz开头开始


评论列表

  • 加载数据中...

编写评论内容

t617162120
发表于 2018-12-6

这个端口   搞的人很迷

评论列表

  • 加载数据中...

编写评论内容

wangqianshun
发表于 2019-6-19

flag错误

评论列表

  • 加载数据中...

编写评论内容

chenastron
发表于 2019-7-25

所有对 IP59.63.200.79 的请求,都会被靶场反代到端口81

referer没有端口号,与之比较的host就不加端口号


我测试分析下来是因为这两个原因。

评论列表

  • 加载数据中...

编写评论内容

kkk
发表于 2019-11-20

提示flag错误的,可能是多复制了一个空格,试一下把flag末尾的空格删掉

评论列表

  • 加载数据中...

编写评论内容

mxh81862469
发表于 2020-1-15

评论列表

  • 加载数据中...

编写评论内容

hack_2_something
发表于 2020-4-3

真的很迷啊,这个端口。或者把referrer的端口改成81,然后保持host和referrer的ip一样就能通过,这个。。。。。。迷啊

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.