SQL注入续篇(Web漏洞及防御)

SQL注入续篇(Web漏洞及防御)

报错注入

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


SQL注入续篇(Web漏洞及防御)

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)


SQL注入续篇(Web漏洞及防御)

2. extractvalue()函数


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

3. updatexml()函数


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

数据库名:cms


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

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支持 ......

SQL注入续篇(Web漏洞及防御)


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


SQL注入续篇(Web漏洞及防御)

insert插入成功!

查看堆叠查询注入源码:


SQL注入续篇(Web漏洞及防御)

箭头指示的代码中允许批量执行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) --+


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

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

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

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

......


二次注入


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

用户正常登录!


SQL注入续篇(Web漏洞及防御)

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

注册账户:


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

数据库查看修改情况:


SQL注入续篇(Web漏洞及防御)

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

用admin/123456登录:

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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

admin用户成功登录!

查看注册页面源码:


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

跳转到:login_create.php


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";

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

代码审计:

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

查看修改密码页面源码:


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

代码审计:

$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!)


SQL注入续篇(Web漏洞及防御)

方法:

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

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

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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

http://10.1.1.8/sqli-labs-master/Less-32/ ?id=1%df'

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

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


SQL注入续篇(Web漏洞及防御)

http://10.1.1.8/sqli-labs-master/Less-32/?id=1%df'--+


SQL注入续篇(Web漏洞及防御)

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

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


SQL注入续篇(Web漏洞及防御)

SQL注入续篇(Web漏洞及防御)

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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

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

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

1. 字符型注入

2. 获取显示位

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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

......

cookie注入


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

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

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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

修改id=1':


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


继续尝试:

id 1' and 1=1 --+

id 1' and 1=2 --+

sleep()

....


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

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

BP抓包显示页面分析:


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

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

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


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)


SQL注入续篇(Web漏洞及防御)

结论:数据库长度为4!

......


SQL注入续篇(Web漏洞及防御)

base64注入

XFF注入

下一篇分析 ......

SQL注入续篇(Web漏洞及防御)

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

收藏 | JS开发必须知道的41个技巧

来自:掘金,作者:火狼链接:https://juejin.i…return?new?tor();}function?cloneymbol(targe)?{??return?bject(ymbol.prototype.valuef.call(targe));}function?cloneeg(targe…oa/tree/master/js/skill;原创码字不易

卧槽!微信居然有“隐身功能”了!

微信好友的一些骚操作,总是让人忍不住感叹,劳动人民的智慧是无…设置头像时,要将这个透明图片拖拽放大。因为是透明的,你会看不到变化,但一定要手动拖拽放大。然后点击保存就修改完成了。?透 明 朋 友 圈?前排提示:仅安卓机适用,苹果不支持复制下面括号里那根长得像毛一样的特殊符号,粘贴到朋友圈然后发送即可。…,觉得内容对你有所帮助的,还请点个「在看」支持,谢谢各位啦~

玩游戏也能学编程:玩会这 15 款编程游戏,就算是入门了!

网址:screeps.com4、CheckioCheckiO 是一个基于浏览器的游戏,你需要使用 Python 或 JavaScript 来解决问题才能将游戏进行下去。比如说第一关是在 60 秒内运输 15 个人。

CSS 变量教程

来源 | https://www.ruanyifeng.co…的声明生效。这与 的"层叠"(cascade)规则是一致的。下面是一个例子。