对于unsigned int 类型来说,-1就是这个很大的整数。因为最高位本来是符号位1,但转成无符号后,这个1就是有效数字位了
解释的很全了 https://stackoverflow.com/questions/27547377/format-specifier-for-unsigned-char
-1的二进制表示是11111111 11111111 11111111 11111111
不管是多少bit的数据,永远是最高位是符号位
你把第8位当符号位,前面都补0,是几个意思
%00(url编码)截断:告诉别人我的话说完了
使用白名单机制下的文件上传:重点是把文件存放到某个地址。
文件上传->文件会被放入目标服务器的缓存目录->移动到代码规定的目录重命名
move_uploaded_file 把上传的文件移动到新位置,成功返回true,不成功返回false
$temp_file是缓存目录下的地址,$img_path是最后要移动到的地址
in_array() 在一个数组中是否能找到指定值
真实网站测试技巧:
1、上传一个正常图片(确保上传功能有效)
2、上传一个图片马(是否检测内容)
3、上传正常图片,改后缀(是否检测后缀)
可能遇到随机重命名了,所以我们上传的文件名没有作用。
这里注意这串数字,与$img_path=$_GET['save_path']."/".rande(10,99).date("YmdHis").".".$file_ext这行代码有关。
save_path=1
我们可以控制GET传参,如果我们写成1.php%00,则后面的重命名都不在意了
这里我们把url中的save_path 中加上%00。就可以发挥作用了。
%00截断第二个靶场和第一个类似,只是GET传参变成了POST,这里POST传参不接受url编码
%00截断和00截断本质上没有区别。有适用范围(php5.4以下),但是很多时候真实渗透测试时,不清楚内环境。
a是标识符,是61
进入hex把61改成00