很多人在做開發的時候並沒有注意到SQL的查詢是可以被改掉的,其實SQL卻是最不安全的因素之一,通過SQL,更有可能去直接執行系統命令,在服務器上新建用戶,修改密碼等操作也不是不可能。
直接 SQL 命令注入就是攻擊者常用的一種創建或修改已有 SQL 語句的技術,從而達到取得隱藏數據,或覆蓋關鍵的值,甚至執行數據庫主機操作系統命令的目的。這是通過應用程序取得用戶輸入並與靜態參數組合成 SQL 查詢來實現的。
$offset = $argv[0]; // 注意,沒有輸入驗證! $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;"; $result = pg_query($conn, $query);
這是最普通的分頁例子,但是如果有人把下面的語句通過unlencecode()編碼以後,
0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres'; --
再把這語句插入到url以後.就會在數據的表中插入一個用戶(通過字段猜測,不過肯定是插入數據了)
注意那個 0; 只不過是為了提供一個正確的偏移量以便補充完整原來的查詢,使它不要出錯而已。 ,這個是手冊上的例子
$query = "SELECT id, name, inserted, size FROM products WHERE size = '$size' ORDER BY $order LIMIT $limit, $offset;"; $result = odbc_exec($conn, $query);
可以在原來的查詢的基礎上添加另一個 SELECT 查詢來獲得密碼:
' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --
再比如:
<?php $query = "SELECT * FROM products WHERE id LIKE '%$prod%'"; $result = mssql_query($query); ?>
如果攻擊提交 a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- 作為變量 $prod的值,那麼 $query 將會變成
<?php $query = "SELECT * FROM products WHERE id LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--"; $result = mssql_query($query); ?>
有人說以上的攻擊必須得知道數據表的結構等阿,但是沒人能保證他們獲取不到這些信息阿,不管通過猜測還是,比如用戶表最常用的就是user,admin表,什麼節點表access啊,不是沒有可能
而且還有通過修改form表單,添加隱藏域的方法來提交表單,asp的更恐怖, 通過sql注入來猜測數據庫語句之類的,而mysql中sql語言不對會報錯,不過,依然不要相信別人輸入的數據。
最好對每個客戶端發送的數據進行嚴格的檢查過濾。以保證網站的安全。而且,可以的話,最好建立一個日志系統,方便你查看網站是否沒入侵過。
PHP中免費的開源產品,如dede,帝國,dz,ecshop等,使用者不再少數!不過,越是開源的產品越危險!因為別人很容易就很獲取到你的數據庫結構,網站目錄結構!網站所有代碼!攻擊網站也輕而易舉:
舉例說明,dedeV5.7的