mysql批量查詢漏洞案例
(1) select * from user where id=1;
(2)select * from user where id=1 or 1=1;
分析: id=1條件只會查詢一條,id=1 or 1=1會查詢表中所有資料
示例**:
// 數字注入
// select * from user where id = 1; // 正常需要
// select * from user where id = -1 or 1=1; // 異常構造
$config = include_once dirname(__file__).'/config.php';
// 獲取網頁傳遞過來的id
$id = isset($_get['id'])?$_get['id']:'';
$db = mysqli_connect($config['host'],$config['user'],$config['password'],$config['database']);
if(!$db)
mysqli_set_charset($db,'utf8');
/*預防辦法:
$id是整形,應該使用is_numeric對其進行判斷,並且進行整形強轉,如下
if(empty($id) || !is_numeric($id) )
$id = (int)$id
*/$sql = "select * from user where id = " . $id; ***// 此處沒有對$id進行過濾,使用者傳入 1 or 1=1時,即可查詢所有資料***
// 查詢結果
$data = mysqli_query($db,$sql);
if(!$data)
$result = ;
// 迴圈列印結果
while ($row = mysqli_fetch_array($data,mysqli_assoc))
// 模擬登陸成功
echo '';
var_dump($result);
echo '
';
mysqli_close($db);
2.登入免密案例
(1)select * from user where name=『ajun』 and password=『e10adc3949ba59abbe56e057f20f883e』;
(2)select * from user where name=『ajun』 # and password=『e10adc3949ba59abbe56e057f20f883e』;
(3)select * from user where name=『ajun』-- and password=『e10adc3949ba59abbe56e057f20f883e』;
第(2)和第(3)中,#號和–分別將sql語句後面and password=『e10adc3949ba59abbe56e057f20f883e』;注釋掉,實際sql只執行 select * from user where name=『ajun』,從而避免密碼條件查詢
**案例:
// select * from user where name = 'ajun' and password = 'e10adc3949ba59abbe56e057f20f883e'; // 正常需要
// select * from user where name = 'ajun' # and password = 'e10adc3949ba59abbe56e057f20f883e'; // 異常構造1
// select * from user where name='ajun'-- and password='e10adc3949ba59abbe56e057f20f883e'; // 異常構造2
$config = include_once dirname(__file__) . '/config.php';
$name = isset($_post['name']) ? $_post['name'] : '';
$password = isset($_post['password']) ? $_post['password'] : '';
if(empty($name) || empty($password))
/*// 預防1
$name = addslashes($name);
$password = addslashes($password);
// 預防2:正規表示式
if (!preg_match("/^[a-za-z0-9]$",$name))
// 預防3:mysql預編譯機制
*/$db = mysqli_connect($config['host'], $config['user'], $config['password'], $config['database']);
if (!$db)
mysqli_set_charset($db, "utf8");
$sql = "select * from user where name='" . $name . "' and password='" . md5($password) . "'"; // 此處,沒有對$name進行過濾,使用者傳入的$name值為 ajun'# 或者 ajun'-- 時,sql將會注釋掉 and password='" . md5($password) . "'",使得sql語句變成 select * from user where name = 'ajun';
$data = mysqli_query($db, $sql);
if (!$data)
$result = ;
while ($row = mysqli_fetch_array($data, mysqli_assoc))
if (!$result) else
echo '
';echo $test;
echo '
';mysqli_close($db);
WEB安全 php mysql5注入防禦(二)
第四天 猜解當前資料庫長度 及庫名 and length database 5 當前資料庫長度 資料庫名 sqlin and ascii substring database 1,1 115 猜解當前資料庫第一位,ascii s 115 and ascii substring database 2,...
WEB安全 php mysql5注入防禦(一)
注入利用函式 mysql5.0及以上版本預設有乙個information schema資料庫,其中儲存有所有資料庫表名和列名資訊。可以開啟phpmyadmin,分別在information schema資料庫的tables表和columns表檢視所有表資訊,了解下面的注入語句的本質。informat...
Mysql注入防禦
1 sql注入的本質原因是應用層的問題 2 sql注入應用層防禦目標是修復sql所有可能的漏洞,做好事前的防範 or 字串閉合 or 單行注釋 多行注釋 加號,url中替代空格拼接字元 concat 字元拼接 萬用字元 param1 foo m2 bar url引數 select url列印常量等 ...