公开课基础演练靶场 第二章 手工注入详细解题思路

猪骑士   ·   发表于 2018-09-02 22:52:19   ·   CTF&WP专版

       话不多说,点击传送门,进入演练网站。如下图。


       url地址栏中和第一章一样,只有ip地址和端口号,光从这里确实无法获取太多有助于解题的信息。页面顶部是大大的logo和常见的nav,这一部分和数据库基本也没什么关系。再下面播放视频的区域也不会动态的和数据库产生联系。然后我们再往下看,终于发现了非常显眼的区域--新闻动态!!!这个区域我们是可以点击它的,并且它还会响应我们(其实就是浏览器请求和服务器响应的过程)。在这个过程中,服务端的后台程序是从数据库中取出相应信息返回给浏览器的。知道了这个原理,那我们就可以点击它来获取某些有用的信息了。如下图。


       我点击了新闻列表中的第一个新闻,地址栏中出现了 id=171,而页面中也显示了一个新闻。这就和我们第一章很像了,于是我开始按照第一章的思路进行解题。

       首先我将id值改为175,发现返回了不同的新闻,那就意味着数据库中存放着不同的新闻内容,且id值应该是主键。如下图。


       然后我尝试在 id=175 后面加上 and 1=1 发现页面报错了。如下图,显示传参错误,参数中不能有and等字符。那就和第一章不一样了,这一章网站的后台程序中做了防注入处理,当我们想要传入一些不符合程序功能的字符时,程序会识别出来。这就意味着我们不能再用get方式进行注入了。


       那又该怎么办呢?当然是采取老师上课讲的cookie注入。在我学后台的时候,我对cookie的认识是这样的--它可以作为浏览器跟服务器通信的一个凭证,因为http协议是无记忆性的,服务器是无法识别浏览器的,但是有了cookie,它就可以凭借cookie的键值对进行识别。应用场景是这样的,比如我打开一个页面,页面中有广告,我点击不再显示广告,以后我再打开这个页面的时候就不再显示广告。但是同样都是浏览器,请求的都是同一个网站,也是同样的服务器,那服务器又是怎样才知道这个浏览器不显示广告,而另一个浏览器显示广告呢?靠的就是cookie,比如当我点击关闭广告时,这个点击动作会在cookie中设置name=100,以后每次这个浏览器发送请求这个网站的请求时,都会在请求头中有cookie:name=100;当服务端的后台程序读出name=100时,就会返回不带广告的页面。当然这里还有一些过期时间之类的问题就不再详细说明。

       通过上述了解,我们知道了一个很关键的点,就是cookie也可以将信息从浏览器带到服务端!!并且信息是在请求头中,而不是直接传参,这样就防止了被刚才的防注入截胡。这样,在参数中没有id,而在cookie中有id,后台程序就可能会将这个id接收。

       下面摘抄了网上实现cookie注入的前提--条件1是:程序对get和post方式提交的数据进行了过滤,但未对cookie提交的数据库进行过滤条件2是:在条件1的基础上还需要程序对提交数据获取方式是直接request("xxx")的方式,未指明使用request对象的具体方法进行获取。

       如此,我们可以尝试使用cookie注入。我在url地址栏输入了如下语句--javascript:alert(document.cookie='id='+escape('176 and 1=1'));这句语句的意思是使用js方式,借用alert弹框函数执行一段js代码,这段代码的作用是在cookie中设置id='176 and 1=1',而escape这个函数的作用是对字符串进行编码,这样就可以在所有的计算机上读取该字符串。如下图。


       出现弹框之后,点击确定,js代码就执行完毕了,如下图。


       接下去再回车一下,重新请求页面,此时就会在请求头的cookie中携带我们刚才写入的信息。如下图。我们发现地址栏中?后面没有参数,但是服务端给我们返回了一篇新闻,因为后台程序接收到了我们在请求头的cookie中传递的 id=176 and1=1,并且是直接request("xxx")的方式这样我们就可以确定这个网站是可以cookie注入的。


       那么我们继续用cookie注入进行下一步,确定查询结果集的字段数。在地址栏写入代码--javascript:alert(document.cookie='id='+escape('176 order by 6')); 176这个值是我测试过可以正常显示的,也就是数据库中确实存在这个id。如下图所示,我发现页面正常显示,因此存在第6字段,那么会不会存在更多的字段呢?下面就继续尝试。


       在尝试完11之后,发现不存在第11字段,也就是说结果集一共只有10个字段。如下图。


       得到字段数,我们就可以进行联合查询了。如下图。地址栏中输入js代码--javascript:alert(document.cookie='id='+escape('1888 1,2,3,4,5,6,7,8,9,10 from admin'));我测试了1888这个id在数据库中是不存在的,也可以直接and 1=2,都可以让前面的查询无结果。这段代码是为了猜测当前数据库中是否存在admin这个表。


       当然,运气很好(心知肚明...),我们发现页面显示没有异常,并且显示出了一些我之前输入的数字--2,3,7,8,9。如下图。



       这样我们就可以将这些数字变成username和password,看看表中是否存在这两个字段。如下图。


       当然,我们的运气还是很好(笑哭...),页面显示正常,并且返回了用户名admin和密码(一串md5加密的字符串)。


       于是,去cmd5网站将这串md5加密的字符串进行匹配查询,得到了密码明文--welcome。如下图。


       既然我管理员账号密码都拿到了,那我该干嘛???当然是找找这个网站下有没有管理员登录页面。于是按照常识猜测管理员的页面一般都叫admin,或者adminLogin之类的。于是又开始尝试...如下图。


       结果当然返回了我需要的页面。如下图。然后我们填入已经得到的用户名、密码和验证码,点击确定。


       竟然成功进入了后台,如下图。得到了通关key--zkz{welcome-control}


       填入flag,就完成了本关。


打赏我,让我更有动力~

1 条回复   |  直到 2018-9-3 | 2896 次浏览

admin
发表于 2018-9-3

学习典型

内容详细

思路清晰

必须奖励

评论列表

  • 加载数据中...

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

© 2016 - 2024 掌控者 All Rights Reserved.