引貼:
http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/
首先需要編寫一個php頁面,講php頁面放入/opt/lampp/htdocs目錄下:
解釋一下這個頁面:
1.通過if語句判斷變量是否初始化
2.if語句中通過mysql_connect()函數連接數據庫
3.連接數據庫成功后,選擇一個數據庫
4.選擇完數據庫后執行一條mysql查詢
5.進行查詢結果的處理
6.使用echo講查詢結果輸出,便於查看
接下來配置數據庫mululu_testdb,創建users表,並且造數據
然后使用 sql 語句取到指定的記錄 參數從瀏覽器傳入
取到的記錄顯示在指定的位置 效果就醬紫:
先來看看 and 注入和 or 注入:
再來看看加法注入和減法注入:
以上就是最簡單的 SQL 注入示例;
通過傳入人為構造的參數 取得本來拿不到的數據;
如果要攻擊數據庫 最起碼要知道被攻擊的是什么數據庫
首先從 Web 應用技術上就可以獲得一些線索:
如果是使用 ASP 或者 .NET 開發的系統 數據庫就可能是 SQLServer
如果是使用 PHP 開發的系統 數據庫就可能是 MySQL 或者 PostgreSQL
而如果是使用 Java 開發的系統 它掛的數據庫就可能是 Oracle 或者 MySQL
除了 Web 應用之外 底層操作系統也可以提供線索:
比如安裝 IIS 作為服務器平台 則后台數據庫就可能是 SQL Server
而允許 Apache 和 PHP 的 Linux 服務器 就可能使用 MySQL 或者 PostgreSQL
另外還可以借助錯誤信息來判斷數據庫類型
因為報錯中有可能直接顯示數據庫的類型:
為了獲知某個表里面存在多少個字段 可以注入 order by 子句:
還可以通過 union 語句注入的方式 獲得數據庫的用戶名和版本:
然后就可以通過注入語句 獲得所有的數據庫的名字:
select * from users where id = 1 union select null,schema_name,null from information_schema.schemata
上圖所示 服務器上所有的數據庫就這樣暴露出來 。。。
有了數據庫的名字 還可以進一步獲取表的名字:
select * from users where id = 1 union select null,table_name,null from information_schema.tables where table_schema='bugfree'
有了表名字 獲取字段名字也很容易:
select * from users where id = 1 union select null,column_name,null from information_schema.columns where table_name='bf_bug_info' and table_schema = 'bugfree'
至此 我們已經利用 SQL 注入的方式 獲得了太多信息
然鵝 我們甚至還可以獲得更多
在掌握數據庫連接密碼的情況下 我們來查詢一下 mysql.user 表:
那么如果沒有密碼呢 通過注入的方式 也可以獲得這些數據:
select * from users where id = 1 union select Host,user,password from mysql.user
以上展示的就是最為基礎的 SQL 注入的實現形式了
假設 SQL 語句是 INSERT into 表名 values ('X',X,X);
那么就往數據庫插入了非法數據了。。。。。