『壹』 如何對網站進行sql注入
首先你要了解什麼是SQL注入漏洞,SQL注入漏洞就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令,比如很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊。
簡單來說,網站一般都是由web應用程序,資料庫,伺服器等組成的,網站的所有用戶數據,密碼表單等等都是保存在資料庫當中的,資料庫的內容按到常理來說是只能在伺服器內部進行查詢,當然,但是,開發人員對客戶端用戶向客戶端提交的參數沒有進行過濾,那麼,黑客就可以從客戶端【瀏覽器,等等,詳細可以學習http協議】向伺服器提交查詢資料庫的SQL語句,如果提交的語句成功的被伺服器給接收到並且執行么,那麼黑客豈不是想怎麼查詢資料庫裡面的內容就怎麼查詢,不是么?那些管理賬號密碼,會員數據不是分分鍾就到手了?SQL注入漏洞危害是非常大的。
當然,這種漏洞是根據提交參數沒過濾而產生的,那麼除了瀏覽器的get提交參數,http協議中還有,post提交,cookie提交,等等。注入漏洞不是網上那些所謂的黑闊,用什麼啊D,明小子之類的亂檢測一氣而找出來的,如果樓主想研究這個漏洞的產生,原理,利用和防禦,是需要進行代碼審計,SQL注入語句基礎,等等。
現在一般常用的工具:SQLmap【這是一款神器,現在是公認最強大的開源注入工具】
建議樓主去看幾本書:《SQL注入天書》《SQL注入漏洞的產生與防禦》
這個漏洞的利用不是幾句話就能說清楚的,詳細的可以追問,純手工打字,望樓主採納。
『貳』 sql server 2005如何以管理員的身份登錄
一、什麼是DAC
SQL Server 2005 為管理員提供了一種特殊的診斷連接,以供在無法與伺服器建立標准連接時使用。即使在 SQL Server 不響應標准連接請求時,管理員也可以使用這種連接訪問 SQL Server,以便執行診斷查詢並解決問題。命令行界面 (sqlcmd) 通過使用特殊的管理員開關 (-A),提供並支持這種專用管理員連接 (DAC)。
二、如何使用DAC登錄到伺服器
1 本機DAC登錄
命令行方式下執行 sqlcmd -A -S sql伺服器名
2 遠程DAC登錄
1)打開遠程DAC選項
EXEC sp_configure 'remote admin connections', 1;
RECONFIGURE;
2)登錄到遠程伺服器
sqlcmd -A -S 192.168.0.1 -U sa -P 123456
3 登錄後, 可以通過查詢動態管理視圖來診斷問題
三、SQL Server Management Studio 與 DAC 配合使用
1、在 SQL Server Management Studio 中,不打開其他 DAC,單擊工具欄上的「資料庫引擎查詢」。
2、在「連接到資料庫引擎」對話框的「伺服器名稱」框中,鍵入 ADMIN:,並在其後繼續鍵入伺服器實例的名稱。例如,若要連接到名為 ACCT\PAYABLE 的伺服器實例,請鍵入 ADMIN:ACCT\PAYABLE。
3、完成「身份驗證」部分(提供 sysadmin 組成員的憑據),然後單擊「連接」。將建立連接。
如果已在使用 DAC,則連接將失敗,並出現錯誤指示無法連接。
使用:
在SQL SERVER 2005中必須用專用管理連接才可以查看過程過程中用到的表
EG:sqlcmd -A
1>use test
2>go
1>sp_decrypt 'p_testa'
2>go
Text
----------------------
Create procere P_testa
with encryption
as
select * from test
『叄』 測試登陸頁面時,如何測試SQL注入漏洞呢
許多網站程序在編寫時,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段資料庫查詢代碼(一般是在瀏覽器地址欄進行,通過正常的www埠訪問),根據程序返回的結果,獲得某些想得知的數據,這就是所謂的SQL Injection,即SQL注入。
網站的惡夢——SQL注入
SQL注入通過網頁對網站資料庫進行修改。它能夠直接在資料庫中添加具有管理員許可權的用戶,從而最終獲得系統管理員許可權。黑客可以利用獲得的管理員許可權任意獲得網站上的文件或者在網頁上加掛木馬和各種惡意程序,對網站和訪問該網站的網友都帶來巨大危害。
防禦SQL注入有妙法
第一步:很多新手從網上下載SQL通用防注入系統的程序,在需要防範注入的頁面頭部用來防止別人進行手動注入測試。
可是如果通過SQL注入分析器就可輕松跳過防注入系統並自動分析其注入點。然後只需要幾分鍾,你的管理員賬號及密碼就會被分析出來。
第二步:對於注入分析器的防範,通過實驗,發現了一種簡單有效的防範方法。首先我們要知道SQL注入分析器是如何工作的。在操作過程中,發現軟體並不是沖著「admin」管理員賬號去的,而是沖著許可權(如flag=1)去的。這樣一來,無論你的管理員賬號怎麼變都無法逃過檢測。
第三步:既然無法逃過檢測,那我們就做兩個賬號,一個是普通的管理員賬號,一個是防止注入的賬號,如果找一個許可權最大的賬號製造假象,吸引軟體的檢測,而這個賬號里的內容是大於千字以上的中文字元,就會迫使軟體對這個賬號進行分析的時候進入全負荷狀態甚至資源耗盡而死機。下面我們就來修改資料庫吧。
1.對表結構進行修改。將管理員的賬號欄位的數據類型進行修改,文本型改成最大欄位255(其實也夠了,如果還想做得再大點,可以選擇備注型),密碼的欄位也進行相同設置。
2.對表進行修改。設置管理員許可權的賬號放在ID1,並輸入大量中文字元(最好大於100個字)。
3.把真正的管理員密碼放在ID2後的任何一個位置(如放在ID549上)。
我們通過上面的三步完成了對資料庫的修改。
另外要明白您做的ID1賬號其實也是真正有許可權的賬號,現在計算機處理速度那麼快,要是遇上個一定要將它算出來的軟體,這也是不安全的。只要在管理員登錄的頁面文件中寫入字元限制就行了,就算對方使用這個有上千字元的賬號密碼也會被擋住的,而真正的密碼則可以不受限制。
『肆』 ASP,SQL怎麼實現普通用戶與管理員登陸到不同界面,代碼怎麼寫
在登陸頁面,收到登陸的用戶名和密碼後,先判斷用戶名是普通用戶還是管理員用戶(普通用戶和管理員用戶,你在資料庫裡面一定有區分的吧)
比如SQL語句:
strSql = "SELECT [Role] FROM [SYS_USER] WHERE [USERNAME] = '"& Request.Form("Username") &"'"
得到角色信息,如果你的[Role]欄位存放的數據是 User 或者 Admin之類的,消斗那麼下面:
判斷出用戶名的角色後,如果是普通用戶就跳轉到會員界面,管理員就跳到管理員界面。
ASP的話,假設 strXX 是獲取到的資料庫裡面用戶角色,
If strXX = 'User' Then
Response.Redirect("User.asp")
Else If strXX = 'Admin'
Response.Redirect("拿源磨Admin.asp")
End If
很久沒有寫ASP了,忘記這個IF語句裂春是不是這樣寫了,你或者用 Swith語句
『伍』 sql注入登錄為什麼使
如果不嚴謹的機制,一般登陸的SQL是賬號+密碼拼成的。再密碼部分添加 「' and 1=1 and 1=2」 等關鍵字 也就是強制 在SQL後面添加條件。 或者同OR 1=1 強制返回true。甚至你可以通過GO後調用函數,新建賬號,提權,獲取管理員許可權等。
『陸』 如何通過注入SQL語句獲取網站管理許可權及安全措施
一 網站是否存在SQL注入漏洞
網站一般包含一張用戶表(用戶名和密碼)和一張管理員信息表(管理員名稱和密碼), 輸入用戶名和密碼之後, 一般做法是後台都會執行一條SQL語句,
查詢有沒有對應的用戶和密碼, 比如SELECT * FROM SomeTable WHERE UserName = $UserName AND pwd =
$pwd, 如果這條語句返回真, 那麼登錄操作就完成了.
試想一下如果在學號和密碼文本框中輸入or=or, 並提交的話, 上面提到的SQL語句就變成了SELECT * FROM SomeTable WHERE
UserName = or=or AND pwd = or=or, 這個語語句變成了一個邏輯表達式, 表達式包含幾段, 分別為:
1. SELECT * FROM SomeTable WHERE UserName = (假)
or
2. = (真)
or
3. (假)
and
4. pwd = (假)
or
5. = (真)
or
6. (假)
最後整個邏輯表達式為0|1|0&0|1|0, 這個結果為真(在執行到"0|1|..."的時候整個表達式省略號中的就不計算了,
因為"或"前面已經是真), 因此可以登錄成功, 事實上也登錄成功了.
二 破解後台資料庫的原理
在用戶名和密碼的文本框中輸入or=or, 截至上面所示的第2步, 表達式值為真, 因為後面緊接了一個"或", 所以無論在這後面的表達式是什麼,
"真或者假""真或者真"都是為真的. 關鍵就是or=or中間的那個=, =表示一個字元, 永遠為真. 如果我們將這個=改成某個SQL表達式,
如果這個表達式為真, 那麼整個表達式就為真.
後面的幾個步驟要求用戶名和密碼文本框中都輸入同樣的文本, 原因是: 後台的語句格式可能是SELECT * FROM SomeTable WHERE
UserName = $UserName AND pwd = $pwd, 也有可能是SELECT * FROM SomeTable WHERE pwd =
$pwd AND UserName = $UserName, 無論哪一種情況, 只要用戶名和密碼都輸入的文本是一樣的, 只要文本中包含的SQL表達式為真,
那麼整個表達式就為真. 這樣寫帶來的另一個好處是復制粘貼很方便.
通過寫一些SQL表達式來一次一次的測試出資料庫里的內容.
三 獲取後台資料庫的表名
如果將表達式替換為(SELECT COUNT(*) FROM 表名)<>0, 這個表達式用來獲取一個表中有多少條記錄,
需要做的就是猜這個表名是什麼, 猜中了的話, 那麼這個表中的記錄條數肯定就不會等於0, 那麼這個表達式的值就是真的. 常用的表名也就是那麼一些,
一個個的代進去試, 最後發現有個叫做admin的表, 它的欄位不為空. 很顯然, 這個表是用來存放管理員信息的.
四 獲取後台資料庫表的欄位名
現在已經知道這個表叫做admin了, 接下來想辦法得到這個表中的欄位.
把表達式替換成(SELECT COUNT(*) FROM admin WHERE LEN(欄位名)>0)<>0,
這個表達式用來測試admin這個表中是否包含這個欄位. LEN(欄位名)>0表示這個欄位的長度大於0, 在這個欄位存在的情況下,
LEN(欄位名)>0是始終為真的. 如果包含的話這個欄位的話, 整條SELECT語句返回的數字肯定不為0, 也就是說整個表達式為真,
從而得到欄位名.
按照這樣的方法, 靠猜共得出了三個很關鍵的欄位:id, admin, pass.
五 獲取欄位的長度
目前已得到的信息是有個admin表, 表中有id, admin, pass欄位. 後台中存儲用戶名和密碼,
常規做法是存儲它們進行MD5加密後的值(32位), 現在測試一下是不是這樣.
把表達式替換為(SELECT COUNT(*) FROM admin WHERE LEN(欄位名)=32)<>0,
將admin和pass代進去結果是真, 說明後台存儲管理員帳號和密碼用的是加密後32位的欄位.
六 獲取管理員帳號和密碼
MD5加密後的字元串包含32位, 且只可能是由0-9和A-F這些字元組成.
1. 獲取管理員帳號
將表達式改成(SELECT COUNT(*) FROM admin WHERE LEFT(admin,1)=A)>0,
意思是我猜測某個adimin帳號的第一個字元是A, 如果成功則表達式成立. 失敗的話, 把A換成0-9和B-F中的任意字元繼續試, 知道成功. 如果成功了,
我再繼續猜這個帳號的第二個字元, 假如第一個字元是5, 我猜測第二個字元是A, 那將表達式改成(SELECT COUNT(*) FROM admin WHERE
LEFT(admin,2)=5A)>0. 可以發現字元串中LEFT()函數中的1變成了2, 另外5A代碼左邊兩個字元是5A, 其中5已經確定下來了.
就這樣重復不斷的猜, 直到得到整個32位的MD5加密後的字元串.
2. 獲取該帳號對應的的id
為什麼需要獲取該帳號對應的id? 原因如下: 按照上一條是可以得到帳號和密碼的, 但一張表中可以有若干個管理員帳號和密碼, 怎麼對應起來呢?
需要通過id. 一個id對應一條記錄, 一條記錄只有一對匹配的帳號和密碼.
將表達式改成(SELECT COUNT(*) FROM admin WHERE LEFT(admin,1)=5 AND id=1)>0,
上一條假設了某帳號第一個字元是5, 只要這個表達式中的"AND id = 1"正確, 那麼就可以得知該帳號的id是1. 如果不是1,
換成其它的數字一個個的試一試.
3. 獲取帳號對應的密碼
現在已經猜出了某管理員的帳號, 並且知道對應的id是多少(假設得出來是4), 現在只要得到該條記錄中記錄的密碼是什麼. 同理,
將表達式改成(SELECT COUNT(*) FROM admin WHERE LEFT(pass,1)=A AND id=4)>0,
注意id已經是知道了的4, 現在要一個個的猜pass中從第1個到第32個字元是什麼, 方法同"獲取管理員帳號"方法.
最後可以得到一個32位的MD5加密後的字元串(密碼).
*注: 如果嫌手工得到每個字元是什麼太麻煩, 可以自己用C#寫一個程序, 模擬一下登錄, 通過控制一個循環, 可以很快得到結果.
七 將MD5加密後的帳號和密碼轉成明文
網上有一些網站資料庫里存儲了海量(幾萬億條)的MD5加密後的暗文對應的明文, 只需輸入你需要查找的MD5加密後的字元串就可以查看到明文是什麼.
『柒』 需要登錄的網頁 sqlmap怎麼注入
·對於需要登錄的網站,我們需要指定其cookie 。我們可以用賬號密碼登錄,然後用抓包工具抓取其cookie填入。
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --cookie="抓取的cookie" #探測該url是否存悄正返在漏洞
·對於是post提交數據的URL,我們需要指定其data參數
sqlmap -u "http://192.168.10.1/sqli/Less-11/" --data="uname=admin&passwd=admin&submit=Submit" #抓取其post提交的數據填入
我們也可以通過抓取 http 數據包保存為文件,然後指定該文件即可。這樣,我們就可以不清廳用指定其他參數,這對於需要登錄的網站或者post提交數據的網站很方便啟飢。
我們抓取了一個post提交數據的數據包保存為post.txt,如下,uname參數和passwd參數存在SQL注入漏洞
『捌』 sql注入中的登陸問題
哪有那麼好注入的啊?有價值的網站不容易注入,容易注入的網站沒有價值(連基本的sql防注入都沒有做好)。
『玖』 幫我改寫一個有sql注入漏洞的登錄界面,C#的,改成參數化查詢
你好,前幾天我剛寫過類似的代碼,帖給你看,絕對原創!
這里有兩種方法可以防止sql注入式攻擊,下面是代碼,
你看不懂的地方可以追問我。
————————————第一種方法——————————————
/// <summary>
/// 用sql參數佔位符,而不是拼字元串的形式
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
private void validateParameter(string username, string password)
{
using (SqlConnection myConnection = new SqlConnection("user id=sa;password=sa;Database =trymybest1988@;data source=127.0.0.1;Connect Timeout=30"))
{
myConnection.Open();
using (SqlCommand cmd = myConnection.CreateCommand())
{
cmd.CommandText = "select * from UserInfo where userName=@Name and userPassword=@Password";
cmd.Parameters.Add(new SqlParameter("Name", username));
cmd.Parameters.Add(new SqlParameter("Password", password));
int i = Convert.ToInt32(cmd.ExecuteScalar());
if (i > 0)
{
//this.lbWeclome.Text = "登陸成功";
string mng = username+"登陸成功!";
Response.Redirect("Result.aspx?Mng=" + mng);
}
else
{
this.lbWeclome.Text = "登陸失敗";
}
}
}
——————————————第二種方法——————————————
/// <summary>
/// 先判斷用戶名存在,再根據用戶名比對密碼
/// </summary>
/// <param name="userName"></param>
/// <param name="userPassword"></param>
/// <returns></returns>
protected int validate(string userName, string userPassword)
{
using (SqlConnection myConnection = new SqlConnection("user id=sa;password=sa;Database =trymybest1988@;data source=127.0.0.1;Connect Timeout=30"))
{
myConnection.Open();
using (SqlCommand cmd = myConnection.CreateCommand())
{
cmd.CommandText = "select * from UserInfo where userName=" + userName;
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
string dbPassword = reader.GetString(reader.GetOrdinal("userPassword"));
if (dbPassword == userPassword)
{
this.lbWeclome.Text = "登陸成功";
}
else
{
this.lbWeclome.Text = "登陸失敗";
}
}
else
{
this.lbWeclome.Text = "登陸失敗";
}
}
}
}