【从0开始学web】89-150 php特性

  • 【从0开始学web】89-150 php特性
  • 前言
  • web89
  • web90
  • web91
  • web92
  • web93
  • web94
  • web95
  • web96
  • web97
  • web98
  • web99
  • web100
  • web101
  • web102
  • web103
  • web104
  • web105
  • web106
  • 未完待续...

前言

php代码审计一直很薄弱,希望完成这部分之后能有所提升。

web89

 <?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 15:38:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/include("flag.php");
highlight_file(__FILE__);if(isset($_GET['num'])){$num = $_GET['num'];if(preg_match("/[0-9]/", $num)){die("no no no!");}if(intval($num)){echo $flag;}
}

关键代码

if(intval($num)){echo $flag;

intval() 函数用于获取变量的整数值。需要拿到一个数字,但是又不被过滤掉,利用数组过滤

数组绕过,payload:?num[]=1

web90

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){$num = $_GET['num'];if($num==="4476"){die("no no no!");}if(intval($num,0)===4476){echo $flag;}else{echo intval($num,0);}
}

payload: ?num=4476x

web91

show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){if(preg_match('/^php$/i', $a)){echo 'hacker';}else{echo $flag;}
}
else{echo 'nonononono';
}

preg_match()正则匹配,下面是一些常用的修饰符

i :ignore-不区分大小写g:global-全局匹配m: multi line -多行匹配s:特殊字符圆点 . 中间包含换行符号

本题目/^php / i m , / p h p /im ,/^php /im,/php/i 第一个if 需要匹配到php,第二个if有不能匹配php,使用换行符绕过,第一个if处存在 m 参数,多行匹配,因此换行后无影响,第二个if 单行匹配,在换行符号后随便输入字符,即绕过

构造payload:?cmd=php%0A123

这里其实涉及到一个漏洞CVE-2017-15715 ,之后可以复现一下

web92

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){$num = $_GET['num'];if($num==4476){die("no no no!");}if(intval($num,0)==4476){echo $flag;}else{echo intval($num,0);}

intval()函数之前遇到过,匹配整数,

和web90类似,但是这里 == 和 ===

两个等号我们称为等值符,当等号两边的值为相同类型时比较值是否相同,类型不同时会发生类型的自动转换,转换为相同的类型后再作比较。

三个等号我们称为等同符,当等号两边的值为相同类型的时候,直接比较等号两边的值,值相同则返回true,若等号两边的值类型不同时直接返回false。

因此可以用科学计数法绕过,如4475e1在if( n u m = = 4476 ) 处 , 因 为 是 科 学 计 数 法 , 是 与 数 字 4476 同 一 类 型 , 值 不 想 等 , 到 了 i f ( i n t v a l ( num==4476)处,因为是科学计数法,是与数字4476同一类型,值不想等,到了if(intval( num==4476)处,因为是科学计数法,是与数字4476同一类型,值不想等,到了if(intval(num,0)==4476) 则被当成字符,匹配整数后变成4476,值想等,成功绕过。

payload:?num=4476e1

web93

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){$num = $_GET['num'];if($num==4476){die("no no no!");}if(preg_match("/[a-z]/i", $num)){die("no no no!");}if(intval($num,0)==4476){echo $flag;}else{echo intval($num,0);}

web90和web92的综合版本

大小写字母被过滤,可以使用小数点绕过,payload:?num=4476.12

后来看了提示还可以用不同的进制进行绕过,过滤了字母但是我们可以使用其他进制就是计算 0b?? : 二进制0??? : 八进制 0X?? : 16进制 payload : ?num=010574

web94

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){$num = $_GET['num'];if($num==="4476"){die("no no no!");}if(preg_match("/[a-z]/i", $num)){die("no no no!");}if(!strpos($num, "0")){die("no no no!");}if(intval($num,0)===4476){echo $flag;}

新怎加一个strpos($num, “0”)函数

函数功能:strpos() 函数查找字符串在另一字符串中第一次出现的位置。小数点绕过,匹配一个0,实质上是过滤了进制转化的方法。开头不能出现0了

payload:?num=4476.0

web95

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){$num = $_GET['num'];if($num==4476){die("no no no!");}if(preg_match("/[a-z]|\./i", $num)){die("no no no!!");}if(!strpos($num, "0")){die("no no no!!!");}if(intval($num,0)===4476){echo $flag;}

. 被过滤了,不能使用小数点了

使用空格+进制绕过

?num=+010574或者?num=%2b010574

web96

highlight_file(__FILE__);if(isset($_GET['u'])){if($_GET['u']=='flag.php'){die("no no no");}else{highlight_file($_GET['u']);}

绕过 == 'flag.php’的条件,高亮输出,找到flag.php的位置即可

payload:

?u=/var/www/html/flag.php
?u=./flag.php

web97

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}

md5数组绕过,值不等,md5值相等

这里是 === 强比较,弱比较的话可以百度有好多md5加密后是0e开头的,弱比较 0=0

如果传入md5函数的不是字符串而是数组,那么就会返回null, null=null绕过

数组绕过 a[]=1&b[]=2

web98

include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

解读一下代码,$_GET?$_GET=&$_POST:'flag'; 将get方法改变为post方法、

$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag'; 大概就是如果get一个flag == flag 转化为cookie方法否则‘flag’

if($_GET['flag']=='flag'){$_GET=&$_COOKIE;
}else{'flag';
}
if($_GET['flag']=='flag'){$_GET=&$_SERVER;
}else{'flag';
}
if($_GET['HTTP_FLAG']=='flag'){//需要满足这个条件就可以输出flaghighlight_file($flag);
}else{highlight_file(__FILE__);
}

大概可以这么理解,所有可以先get一个HTTP_FLAG,然后会转化为post请求,再post HTTP_FLAG 即可

思路应该没错hh

web99

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){file_put_contents($_GET['n'], $_POST['content']);
}

file_put_contents() 函数把一个字符串写入文件中。

与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

语法:file_put_contents(file,data,mode,context)

array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。

该函数等于多次调用 $array[] = $value。

in_array() 函数搜索数组中是否存在指定的值。存在则返回1

注释:如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。

语法:in_array(search,array,type)

<?php
highlight_file(__FILE__);
$allow = array();//设置为数组
for ($i=36; $i < 0x36d; $i++) {array_push($allow, rand(1,$i));//向数组里面插入随机数
} i
f(isset($_GET['n']) && in_array($_GET['n'], $allow)){//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET['n'], $_POST['content']);
//写入1.php文件 内容是<?php system($_POST[1]);?>
} ?
>

嗯,没做出来

web100

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){if(!preg_match("/\;/", $v2)){if(preg_match("/\;/", $v3)){eval("$v2('ctfshow')$v3");}}}

is_numeric() 函数用于检测变量是否为数字或数字字符串。语法:bool is_numeric ( mixed $var )

如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。

首先是这里$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);

开始想着怎么构造绕过and,后来发现 = 的优先级更高,只要v1 = 数字或字母即可

?v1=1&v2=system('ls')&v3=;?v1=1&v2=system('cat ctfshow.php')/*&v3=*/;

回显:ctfshow.php flag36d.php index.php

class ctfshow{var $dalaoA,$dalaoB,$flag_is_655676950x2dc9250x2d4dfc0x2dace80x2d9989e408211a;
}

ctfshow{65567695-c925-4dfc-ace8-9989e408211a}

或者?v1=21&v2=var_dump($ctfshow)/&v3=/;

web101

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){eval("$v2('ctfshow')$v3");}}}

和上题类似,但过滤了太多东西了,使用反射形。ReflectionClass 类报告了一个类的有关信息。

?v1=1&v2=echo new ReflectionClass&v3=;

这样就可以直接输出$ctfshow这个类的有关信息

ctfshow{9efdf2de-6aee-4970-8493-c4399c970872} 提示说少了一位,emm,从0输到f 哈哈

web102

highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){$s = substr($v2,2);$str = call_user_func($v1,$s);echo $str;file_put_contents($v3,$str);
}
else{die('hacker');
}

call_user_func — 把第一个参数作为回调函数调用

substr() 函数返回字符串的一部分。substr($v2,2); 从2位置开始,截取作为call_user_func的第二个参数v1作为 call_user_func的第一个参数。v3作为 file_put_contents的文件名。

payload:?v2=1&。。。词穷了 web99也是file_put_contents函数,没做出来,先放着,仔细研究一下再来写

web103

同web102,先放一下

web104

highlight_file(__FILE__);
include("flag.php");if(isset($_POST['v1']) && isset($_GET['v2'])){$v1 = $_POST['v1'];$v2 = $_GET['v2'];if(sha1($v1)==sha1($v2)){echo $flag;}
}

sha1() 函数计算字符串的 SHA-1 散列。

嗯,计算字符,搞个数组都返回错误

get :?v2[]=1

post:v1[]=1

web105

highlight_file(__FILE__);
include('flag.php');
error_reporting(0);
$error='你还想要flag嘛?';
$suces='既然你想要那给你吧!';
foreach($_GET as $key => $value){if($key==='error'){die("what are you doing?!");}$$key=$$value;
}foreach($_POST as $key => $value){if($value==='flag'){die("what are you doing?!");}$$key=$$value;
}
if(!($_POST['flag']==$flag)){die($error);
}
echo "your are good".$flag."\n";
die($suces);

这里出现了$$ ,双美元符号在PHP中,$var(单美元)表示一个名为var的普通变量,它存储字符串、整数、浮点等任何值。而$$var(双美元)是一个引用变量,用于存储$var的值

?suces=flag# post
error=suces

这样suceserror都覆盖成了$flag,不管die 哪个,都会输出flag.

web106

highlight_file(__FILE__);
include("flag.php");if(isset($_POST['v1']) && isset($_GET['v2'])){$v1 = $_POST['v1'];$v2 = $_GET['v2'];if(sha1($v1)==sha1($v2) && $v1!=$v2){echo $flag;}
}

和web104类似,只是这里v1!=v2 ,同样的构造数组,值不一样即可

未完待续…

【从0开始学web】89-150 php特性相关推荐

  1. 2021-10-14【从0开始学web】279-300 java

    [从0开始学web]279-300 java [从0开始学web]279-300 java web279 web278-297 279-297题都是struts2框架漏洞 Struts2是用Java语 ...

  2. 提升之路--从0开始学web自动化(7)--ui自动化框架搭建PO模式

    ui自动化测试在整个测试过程中占据的地位 在一个项目的测试中手工测试(60%)/自动化测试(40%),不同公司的定义不同.总体是手工占大部分 而自动化测试中,接口自动化占据70% ui自动化测试优先实 ...

  3. 【从0到1学Web前端】javascript中的ajax对象(一)

    [从0到1学Web前端]javascript中的ajax对象(一) 如今最流行的获取后端的(浏览器从server)数据的方式就是通过Ajax了吧.今天就来具体的来学习下这个知识吧.假设使用ajax来訪 ...

  4. 0基础转行IT行业学web前端好吗?

    0基础转行IT行业学web前端好吗?目前互联网行业迅速发展,IT已经成为现在的一个非常热门的一个行业,许许多多的人都想要往IT方面发展,找IT方面相关的一个工作. 很多想要接触IT行业的初学者伤透了脑 ...

  5. 菜鸟学WEB开发 ASP.NET 5.0 1.0

    菜鸟学WEB开发 ASP.NET 5.0 1.0 在学习之初我要强调一点"微软要向跨平台开发"大举进军了,不管他能走多远,这是微软的必经之路. 一.学习流程: 创建ASP.NET ...

  6. 从0开始学爬虫6比价工具开发1之爬取当当、京东的数据

    从0开始学爬虫6比价工具开发1之爬取当当.京东的数据 爬取当当数据 spider_dangdang.py #coding=utf-8import requests from lxml import h ...

  7. 0基础学怎么学习python

    ​ Python相对于其他编程语言来说是比较简单的,非常适合零基础的小白学习,想要进入到互联网行业,可以优先选择学习Python,那么下面小编就来为大家详细的介绍一下0基础学怎么学习python? ​ ...

  8. html语言难不难学,Web前端开发难学吗?

    Web前端开发难学吗? 更新时间:2019年02月22日16时54分 来源:传智播客web前端培训 浏览次数: 关于Web前端开发难学吗?学Web前端都需要学习哪些内容?很多想要转行学习Web的同学还 ...

  9. 0基础学python难吗-0基础学武汉Python开发课程有多难?该怎么入门?

    Python语言可谓十分强大,正如它的两个外号所称,一个是"内置电池",另一个是"胶水语言".开源社区和独立开发者长期为Python贡献了丰富大量的第三方库,其 ...

最新文章

  1. etcd分布式之消息发布与订阅
  2. 微信端上传图片方式1
  3. 二、“究恒常之宇宙,成一家之学说”
  4. javascript中的模块系统
  5. JDK8的日期时间类1
  6. 为何苦命干活的人成不了专家?
  7. 【总结整理】JavaScript的DOM事件学习(慕课网)
  8. 支援 Chrome 插件:微软 Chromium 内核 Edge 浏览器可以下载啦!
  9. iphone iPhone开发中如何将制作图片放大缩小代码实现案例
  10. Elementui tabs组件内添加组件
  11. VisualStudio2017密钥(key)
  12. ubuntu下virtualbox安装windows7
  13. 个人对于封装继承多态的理解
  14. docker之部署一个不中毒的浏览器
  15. 剖析人生赚钱五大境界颠覆你的认知
  16. vue子组件的使用和事件传递
  17. 苹果Mac虚拟机 Parallels Desktop 17 安装 Win11 体验
  18. python plot画柱状图_matplotlib使用:画柱状图
  19. Java到底能干什么?
  20. LTE MAC层令牌桶算法

热门文章

  1. 《人人都能玩赚ChatGPT》:一份简明易懂的 ChatGPT 技术指南
  2. 如何坚持不懈的做某件事情
  3. 带你了解什么是MySQL数据库(八)数据库锁机制
  4. Tesseract训练中文字体识别(转)
  5. note_10:surface laptop2遇到的问题和解决方案
  6. idea新建module无法push到GitHub,没有Git选项
  7. 【LEDE】x86软路由之路-12-浅谈复杂网络环境中的AP优化
  8. 土木工程结构力学————钢架的位移法
  9. 第二章 MATLAB数据与矩阵
  10. AR红包大战,抢的不是钱而是发展机会