本文备份于我的博客大家好,我是Web安全板块的新版主crownless。最近我将以CTF赛题讲解的形式介绍一系列的Web基础知识,讲解的顺序将是循序渐进,因此不需要读者有任何基础知识。希望能吸引更多人关注看雪的Web安全板块,为板块增加人气和活力。如果你还没有阅读第一篇教程,建议你先阅读第一篇教程再阅读本文。在这篇文章中,你将学到:
话不多说,让我们开始吧。首先打开这次的CTF赛题网站:http://139.224.220.67:23900/dmsj/level0/你会发现一片空白,网页的源代码也为空。这里,我提供php后端的源代码供你审计:
首先,flag变量被设置为flag{xxxxx}。当然,这是一个假的flag,真实运行的后端中的flag变量才是真的flag,需要我们去夺取。接着,isset函数判断HTTP GET请求中的参数a是否已设置并且非NULL。strcmp函数将a参数与flag相比较,如果一致,则调用die函数。die函数的作用是打印die函数的参数,并立即停止该php后端的运行。那么我们的目标很明显,就是要让php执行到die函数,让flag显示出来。那么我们怎么给php后端传参呢?在第一篇教程中,我们可以通过在输入框中输入内容并点击提交按钮,由浏览器帮助我们自动传参。现在,我们必须要手动传参了。其实也很简单,只要访问http://139.224.220.67:23900/dmsj/level0/?a=123即可给a参数传入123。接下来难题来了,你根本不知道flag是什么,又怎么让strcmp函数返回0,即比较相等呢?查看strcmp的介绍页面,我们可以发现下方有一条注释:
flag
flag{xxxxx}
a
123
If you rely on strcmp for safe string comparisons, both parameters must be strings, the result is otherwise extremely unpredictable.
即,如果我们给strcmp传入非字符串的参数,那么结果是非常未知的。下面还给出了一些例子:
怎么样,是不是让人大开眼界呢?这就是“世界上最好的语言”——php。事实上,我们可以给a参数传入一个数组。比如,如果我们访问http://139.224.220.67:23900/dmsj/level0/?a[0]=123,那么我们就相当于给a参数传入了一个数组,该数组的第0个元素是123字符串。试试看访问http://139.224.220.67:23900/dmsj/level0/?a[0]=123,你会惊喜地发现打印出了flag。当php将一个数组变量和一个字符串进行比较时会意外地返回0,即相等,是不是很让人惊讶呢?好了,这次的讲解就到这里,敬请期待下次的教程。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
erfze 第一个flag的作用域是什么?为什么die函数中的flag不是这个假的flag呢?它的查找顺序是怎样的?希望楼主解答一下,谢谢。
天使的脉动 版主,页面好像无法访问了