​🕸️​CTFWeb周报11

第十一次提交的周报,复习一下最基础的PHP,之前没学明白

CTFWeb周报11

十一次周报

Web

PHP特性

弱比较

字符串的运算(T1)
php
<?php
highlight_file(__FILE__);
error_reporting(0);

$s = $_GET['a'];
if(!is_numeric($s)){
  if($s+1 === 1000){
  die(getenv('FLAG'));
  }
}
?> 

payload =>

?a=999a

知识点

在PHP中,当你对一个字符串进行算术运算时,PHP会尝试将这个字符串转换为一个数字。如果字符串的开头部分是一个有效的数字,那么PHP会使用这个数字进行运算,忽略后面的非数字部分。

所以999a既绕过了!is_numberic,又在$s+1的时候得到1000。

Hash绕过(T2)
php
<?php
highlight_file(__FILE__);
error_reporting(0);

$a = $_GET['param1'];
$b = $_POST['param2'];
$c = $_GET['param3'];
$d = $_POST['param4'];

if($a!=$b && md5($a)==md5($b) && $c!=$d && sha1($c)==sha1($d)){
    echo getenv('FLAG');
}else{
    echo "fail";
}
?> 

payload=>

GET param1=240610708&param3=aaroZmOk

POST param2=QLTHNDT&param4=aaK1STfY

知识点

某些字符串经过hash处理后的值为0e开头的,PHP会当作科学计数法来处理。两个0e开头的hash值弱比较是相等的。

在此中情况下被弱比较类型判定为相等的hash值就被成为magic hash

数组绕过 T3

这里是强比较,没法用hash绕过,因为'0e666'==='0e777'的值为false。上一题hash绕过的题也是可以进行数组绕过的。

text
<?php
highlight_file(__FILE__);
error_reporting(0);

$a = $_GET['a'];
$b = $_GET['b'];
if($a!==$b && md5($a)===md5($b)){
    echo "success!";
}else{
    echo "fail";
}
?> 

传入?a=c&b=d就行

PHP中hash绕过和常用函数_php hash强比较绕过-CSDN博客

intval绕过

intval() 函数用于获取变量的整数值,可使用指定的base进制转换。

语法: int intval ( mixed var[,intvar [, int base = 10 ] )

1、进制自动转换

第二个参数 $base 允许为空。

当 base 为空时,默认值是 0,会根据 $var 的格式来调整转换的进制。

  • 如果 $var 以 0 开头,就使用 8进制
  • 如果 $var 以0x开头,就使用 16进制
  • 否则,就使用 10进制

数字被过滤时,可使用其他进制来绕过。

2、转换数组

intval()转换数组类型时,不关心数组的内容,只判断数组中有没有元素。

  • 空数组 ==> 返回0
  • 非空数组 ==> 返回1

弱比较 a==b 可以传入空数组使他们的intval()值相等。

3、转换小数

转换小数类型时,只取个位数,小数全丢了。

增加小数位来判断原来的值不相等,但是intval()相等

4、转换字符串

转换字符串时从左到右遇到字母就结束,返回字母之前的数字。

text
var_dump(intval('12abc'));		//int(12) 
var_dump(intval('abc123'));		//int(0) 
var_dump(intval('1a2b3c'));		//int(1) 
var_dump(intval('0101'));		//int(101)
var_dump(intval("0x2b"));		//int(0) 
var_dump(intval(0x2b));		//int(43)
5、取反~

intval()支持取反符号。

php
echo ~123; //result: -124
var_dump(intval(~-124)); //result int(123)

可以用取反来绕过过滤

6、算数运算符

如果传入的包含算数运算符,则会运算再进行函数处理。

php
var_dump(intval(5*3)); //int(15)
var_dump(intval('5*3')); //int(5) 因为它是字符串

运算符绕过

7、浮点数精度缺失问题
php
var_dump(intval(0.34*100.0));
var_dump(intval(0.58*100.0));

第一个输出int(34)
第二个输出int(57) 出现了精度缺失

这个感觉有点不常用,,出现了也不好想。。。

PHP intval()函数详解,intval()函数漏洞原理及绕过思路_intval函数-CSDN博客

strcmp绕过 T4
php
strcmp(string1,string2)
返回值
    string1==string2 返回 0
    string1>string2 >0
    string1<string2 <0

strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值NULL,NULL==0为true,正是利用这点进行绕过。

php
<?php
include 'pass.php';
highlight_file(__FILE__);


if(isset($_GET['password'])){
    if(strcmp($_GET['password'], $password)==0){
        echo getenv('FLAG');
    }else{
        echo "Wrong";
    }
}
?>

这里传入password=xxx传入的是数组,就会绕过了。

变量覆盖

extract函数

extract() 函数从数组中将变量导入到当前的符号表。

extract($_GET); // 把GET请求中的内容变为变量

?a=1&b=2之后,a的值是1a的值是1 b的值是2

php
<?php
highlight_file(__FILE__);
error_reporting(0);

$param2 = 'param2';
extract($_GET);
if($param2==='getflag'){
	echo getenv('FLAG');
}
?>

这题传入?param2=getflag就能把get请求中的param2的getflag变成变量,覆盖掉原来的param2。

双重$(可变变量)

NSS上面的题,第一眼看到还是比较蒙的,但是GPT告诉我,get请求可以直接传入数组,第一次知道

以前遇到问题就百度,难在描述问题和寻找对应的回答,现在GPT可以直接解惑,降低了门槛,这是一个快速解决问题的好时代。

payload =>

/?aparam1=abc&acontent=abc&aparam2=getflag

php
<?php
highlight_file(__FILE__);
error_reporting(0);

$param2 = 'param2';
foreach($_GET['a'] as $key => $value){
    $$key = $value;
}
if (isset($param1)) {
    if ($param1 == $content){
        if($param2==='getflag'){
            echo getenv('FLAG');
        }
    }else{
        echo "Oh..nooo";
    }
}
?>

举个例子,如果 URL 是 example.com?a[foo]=bar&a[baz]=qux,那么 $_GET['a'] 将是:

php
array('foo' => 'bar', 'baz' => 'qux');

这个可变变量就是两个美元符号,最终的变量由第二个美元符号变量的值决定。

比如 a='flag'; $$a就是flag;

多重$ 套娃变量
php
<?php
highlight_file(__FILE__);
$a='b';
$b='c';
$c='d';
$d='e';
echo $$$$a;
?>

这个最后执行返回的是'e';

从右到左一层一层分析,第一次见到的时候是比较懵b的。之前遇到过一个题,是获取scheme的,也是多重$记不清了。。。

parse_str

parse_str() 函数把查询字符串解析到变量中。

php
<?php
parse_str("name=Peter&age=43");
echo $name."<br>";
echo $age;
?>

上面的代码取自菜鸟教程。可以看到parse_str就是把字符串转为变量。

import_request_variables

import_request_variables() 函数将 GET/POST/Cookie 变量导入到全局作用域中。该函数在最新版本的 PHP 中已经不支持。

import_request_variables() 函数将 GET/POST/Cookie 变量导入到全局作用域中。如果你禁止了 register_globals,但又想用到一些全局变量,那么此函数就很有用。

版本要求:PHP 4 >= 4.1.0, PHP 5 < 5.4.0

🍕JavaScript-创建对象的六种方式
❕字节序:小端模式和大端模式

评论区

评论加载中...