pass9
直接查看的源码,得知是黑名单过滤,而且过滤也都很全
通过查看wp,得知我们可以使用. .(点空格点)进行绕过
利用bp抓包进行更改
trim删除文件名末尾的点,得到shell.php.空格,然后进行首尾去空得到shell.php.,黑名单过滤并没有php.所以直接绕过黑名单检测
上传成功
连接成功
pass10
这关很奇特的哦,直接可以注入成功,肯定有坑
查看上传文件的文件夹,也有文件呀
最后查看提示源码才知道,这关过滤不完全,没有对上传文件做转换小写的处理只是会直接去除掉一些后缀名,我这里因为之前需要用到大小写过滤就没有改回来,凑巧绕过了
开了别人的wp才知道这里原来是要双写绕过,shell.pphphp,当上传过滤掉php后变成shell.php
哦哦原来我是小丑,上面截图的php文件是我上一题上传的,旁边的shell没有后缀名的文件才是第十关我上传的,丢脸
源码中用到的函数恰好有无视大小写的功能,看来要出一期upload-labs的代码解析了,这不加注释直接看不懂,还以为自己很牛嘞
还是要用到双写绕过,这次是把之前上传文件都删掉的,可以看见已经是上传成功
但是我觉得我这种直接更改后缀名的,不知道会不会出问题,之后还是利用bp改吧
蚁剑连接成功
pass11
这题是白名单哦
白名单的绕过方式,最近复习了一下目前会的只有00截断和结合文件包含上传图片马绕过
那这里就使用00截断咯,但是00截断有php版本限制
使用bp抓包后更改这两个地方应该没错,但是直接提示我上传失败是什么东西
我以为是php版本的问题,换了一个php5.3.29的还是出错
想着还是来理解一下源码的意思
$file_ext语句
substr()函数
返回字符串的一部分。
语法
substr(string,start,length)
string:必须,规定要返回数据的字符串
start:必须,规定在字符串的何处开始
正数:在字符串的指定位置开始
负数:从字符串结尾的指定位置开始
0:在字符串的第一个字符处开始
length:可选,规定要返回的字符串长度,默认是知道字符串的结尾
正数 - 从 start 参数所在的位置返回
负数 - 从字符串末端返回
strrpos()函数
查找字符串在另一字符串中最后出现的位置(区分大小写)
语法
strrpos(string,find,start)
string:必需。规定被搜索的字符串。
find:必需。规定要查找的字符。
start:可选。规定开始搜索的位置。
$file_ext语句总结
这一句话的作用就是:
在我们上传的文件中获取我们上传文件的文件名和字后缀
利用strrpos函数从文件名和后缀中查找.返回点的位置作为substr函数的第二个参数
所以就直接查找到了我们上传文件,点之后的后缀名
大if语句
in_array函数
in_array() 函数的作用是搜索数组中是否存在指定的值。
这个函数是作为if函数的判断条件,如果返回为true就执行if语句,反之执行else
语法
bool in_array ( $mixed , $array [,$ bool = FALSE ] )
$mixed必需。规定要在数组搜索的值。
$array必需。规定要搜索的数组。
$ bool可选。如果该参数设置为 TRUE,则 in_array() 函数检查搜索的数据与数组的值的类型是否相同。
$temp_file
就是我们上传的文件
$img_path
就是定义的一个上传路径
save_path由GET的方式获取
在php中.点代表的是拼接字符串,说明此题的上传路径是可控的
最终的上传路径是save_path/(10,99)随机数字日期时间.(png/jpg/gif)
上传一个图片就可以很形象的看出这个路径发挥的作用
大if语句总结
这个if语句作用就是取出我们上传文件的后缀名
然后进行判断,如果我们的后缀名在白名单里就定义上传的文件和上传路径
小if语句
move_uploaded_file函数
move_uploaded_file() 函数把上传的文件移动到新位置。
如果成功该函数返回 TRUE,如果失败则返回 FALSE。
语法
move_uploaded_file(file,newloc)
file必需。规定要移动的文件。
newloc必需。规定文件的新位置。
move_uploaded_file()在遇到%00时候会截断,也就是说move_uploaded_file(shell.php%00/123.jpg)=move_uploaded_file(shell.php)
绕过方法:上传正常的文件名,抓包,修改save_path为shell.php%00即可绕过
实践
我都服了我说怎么一直弄不上,一直给我回显上传失败
说明上传是成功的,但是move_uploaded_file函数判断除了问题,上网查别人的wp注入方式也都一样。只不过都提到magic_quotes_gpc
特地了解了一下,这个函数的作用是在字符前添加反斜线作为转义字符理解,这就将我们后面修改的数据变成了字符串而不是以代码解析,怪不得报错信息会这样显示
我一开始查看的时候是关闭的,但是切换php版本后,这个选项会自动打开,所以导致注入失败
关闭之后抓包更改两个数据
注入成功了
pass12
12也是白名单过滤,害真不知道该怎么判断是什么注入,看11题wp的时候早就把12瞟到了,这关是POST类型的00截断
这两种方法的区别为POST不会对里面的数据自动解码, %00解码后和00 hex解码后的值相同,所以修改为00即可需要在Hex中修改为00 即可成功绕过
还是要查看别人的wp,这里有两种方法都很简单
首先还是要跟上一题一样,要进行抓包然后修改路径和后缀
然后因为不会自动转码的原因,我们可以将%00选中然后打开bp右侧的窗口,手动将它编码后的字符将原先的数据包里的%00给替换掉
换掉之后它是看不见的,没有关系我们可以直接发包
上传成功
还有一个方式就是,在php后添加一个字符,随便什么应该都可以只是做个标记,然后点击Hex进入十六进制编码格式
找到刚刚标记的位置,将原先+的十六进制编码替换为00,就可以了
关于怎么着位置,一行对一行然后每个字符都对应一个编码从左往右数就好
(我这里是因为已经做过两次所以+编码的位置比较靠后)
修改后直接发包也是可以上传成功的