php mysql注入講解和防禦

2021-09-18 04:28:53 字數 3014 閱讀 7693

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列印常量等 ...