前言
这次的培训因为种种原因,效果不太好,录屏也没有录上。我本来是想着抽时间重新录一次课,但周内没啥空余时间,因此我就想写博客复现一下这次培训。朱爹告诉我讲的太难了,想到大家基本都是零基础,我决定按照朱爹的思路,尽量讲的简单,那么我们正式开始。
正文
基础函数及系统命令
在正式讲命令执行漏洞前,我们先来了解几个常用的函数和用法,以便后面理解。
phpinfo()
phpinfo()是PHP语言的函数,效果是查看当前服务器的PHP信息,作为最基础的函数,一个页面只要能够运行phpinfo(),那就代表其他函数基本都能够执行了。因此phpinfo()函数常用来测试,测试PHP代码能否运行。
$_GET['']
$_GET[’’]是PHP语言的函数,通过 URL 参数传递给当前脚本的变量的数组。(摘自百度),也就是由网页链接来向服务器传入参数,GET函数有特定的格式,举个例子,如果我们可以通过GET函数给www.baidu.com传入一个参数’a‘,而这个传入的’a‘赋值为123,那么格式如下:
www.baidu.com?a=123
如上面所示,GET函数具体格式就是在网址(也就是url)后加上’?’,再加上要传入的参数名字和它的赋值即可。
$_POST['']
$_POST[’’]是PHP语言的函数,和GET类似,也是给服务器传入参数,不过方法不同,格式不同,为了方便,我们一般选择使用插件来进行POST传参。这里推荐新人使用Firefox免费的插件max hackbar,下面是详细的插件安装过程: 首先你要有个火狐浏览器 下载完成后,打开浏览器,点击右上角的三条横线 点击扩展和主题 搜索max hackbar 找到对应的插件点进去并下载,这里由于我是早就下好了,所以上面显示的“移除” 下载完成后,点击F12,就可以在开发者面板里发现此插件,刚下好可能暂时打不开,缓几分钟。 那么如果我们想要POST参数,就可以利用这个插件,举个例子吧,比如我们现在在www.baidu.com这个网站,如果我们可以通过POST传入一个参数’a‘,a的值为123,步骤如下: 打开刚刚下载的插件,点击Load URL,载入网址 点击Post Data 输入a=123 点击Execution即可成功上传。
cd
是Linux下的系统命令,用于切换当前工作目录。 如图,是用cd命令进入根目录下的Desktop目录。
cat
这个不是猫的意思哈,这也是Linux的系统命令,用于连接文件并打印到标准输出设备上,也就是输出对应的文件。
tac
tac命令用于将文件已行为单位的反序输出,即第一行最后显示,最后一行先显示,和cat命令正相反。
ls
ls是用于显示指定工作目录下之内容的Linux的系统命令。 如图,就是通过ls命令查看根目录的内容。
cp
cp也是Linux系统命令,主要用于复制文件或目录。举个例子:
cp 1.txt 2.txt
以上代码意思即是将1.txt复制并粘贴成为新文件2.txt 。 接下来我们开始正式讲漏洞内容。
命令执行漏洞
命令执行漏洞产生的原因,即是应用和网站未对用户输入的参数进行严格的检查过滤,导致用户可控的参数被当成命令来执行。
在PHP中,有时需要调用一些执行命令的函数,如: eval()、 assert()、preg _replace()、create _function()等, 如果存在一个使用 这些函数且未对可被用户控制的参数进行检查过滤的页面,那么这 个页面就可能存在命令执行漏洞。
按照朱爹的思路,我们讲一个最有代表性的,最基础的函数,eval()。 eval() 函数把括号内的字符串当作PHP代码执行,但有一个格式上的要求,就是括号内的字符串要是正式的PHP代码,因此需要由分号结尾。 我打算以咱们Tran$iCoders的基础命令执行题为例,但在此之前,我们再讲一个命令执行的系统函数。
利用PHP的系统命令执行函数来调用系统命令并执行.这类函数有 system()、exec()、shell_ exec()、passthru()、penti_ exec() 、popen()、 proc_pen()等, 此外还有反引号命令执行,这种方式实际.上是调用 shell_ exec()函数来执行。
这里我们讲system()函数,system()函数的作用即是调用服务器的系统命令,比如说,如果服务器是Windows系统,我们可以利用system(‘dir’)来执行Windows的dir命令,查看目录;而如果服务器是Linux系统,system(‘ls’),也是查看当前目录。
接下来我们看看朱爹的题,代码如下:
<?php
highlight_file("index.php");
$a=$_GET['s'];
eval($a);
?>
由于大家应该都没有接触过PHP语言,这里给大家解读一下,我们直接从关键位置开始
$a=$_GET['s'];
即是用GET方法传入一个参数s,将s赋值给变量a,举个例子,如果我们传入的内容为:?s=123 ,那么这句代码意思就是:$a=123 。
eval($a);
利用eval函数执行括号内代码,这里括号内是$a,也就是执行a代表的字符串,就拿刚才的例子来说,传入的s为123,于是变量a也是123,所以到这里就成了eval(123),由eval函数执行代码’123’,当然,举例的123并非PHP代码,所以当然是无法成功执行的。
那么我们接下来干什么呢,先给大家介绍一下信息安全竞赛的目的。
我们这种比赛名为CTF,CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。比赛目的在于利用各种漏洞,找到题目环境中的flag文件并提交,便可得分。
回到这道题,我们该如何利用刚刚讲的命令执行漏洞拿到这道题的flag呢,这里我们看看题目的提示:flag在根目录哦 我们如何查看服务器的根目录,这就要靠刚刚提到的eval函数和system函数了,因为eval函数可以执行括号内函数,所以我们可以传入system函数并执行相应的系统命令,来查看文件。
http://47.103.123.81:20010/?s=system('ls /');
正如前面所述,ls命令是Linux中查看目录的系统命令,'ls /'则是查看根目录的用法,如此上传后我们可以看到服务器的根目录文件 可以看见其中的flag文件吗,这就是我们要找的flag,那我们怎么查看这个文件呢?不妨退回去看看我们上面讲到的cat命令和tac命令,这里我们选择tac命令,为什么呢,因为flag是PHP文件,正向不一定会输出,因此我们选择用tac命令倒序输出。
http://47.103.123.81:20010/?s=system('tac /flag');
传入便可以得到flag文件。
至于我本来打算讲的其他函数,大家可以看看我发的ppt转的PDF文件,下来自学一下。
本文出现什么问题,都可以QQ或就在网站里私信我,我会立即修改。
分享一下自己的学习经历:我学习信息安全,前几个月都是完完全全不知道自己在干什么的,但只要度过了这个阶段,成功入门,那便是豁然开朗,希望大家坚持下去,不要被开头的不知所措劝退,重振信安荣光,吾辈义不容辞。
有什么不懂的也可以私信问我,当然我周一周二比较忙就是了。
|