报错注入
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
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)
2. extractvalue()函数
3. updatexml()函数
数据库名:cms
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支持 ......
http://10.1.1.8/sqli-labs-master/Less-38/?id=1' ; insert into users(id,username,password)values('66','wenxin','123.com') --+
insert插入成功!
查看堆叠查询注入源码:
箭头指示的代码中允许批量执行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) --+
堆叠查询与联合查询(union select)的区别:
联合查询只能查询(select),堆叠注入可以执行任意语句!
(insert/update/create/delete...等)
......
二次注入
用户正常登录!
登录页面还有"忘记密码"和注册新用户的功能!
注册账户:
登录数据库系统,查看用户信息!
此页面下修改admin'#的密码:
数据库查看修改情况:
结论:admin'#并没有被修改,但修改了原数据库里的admin的密码(原来admin的密码是admin)
用admin/123456登录:
返回HOME,注销当前账户(Logout)!
admin用户成功登录!
查看注册页面源码:
跳转到:login_create.php
$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";
注册后,插入数据库的SQL语句!
代码审计:
结论:仅对特殊字符"进行了转义!
查看修改密码页面源码:
代码审计:
$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!)
方法:
在地址后先加一个%df,再加单引号,因为\的编码为%5c,而在GBK编码中,%df%5c是繁体字"連",这样\就消失了,那么'不是作为内容了,最后开发人员构建的SQL语句中,由于多出一个不是内容的'就会报错!这时我们可以构建SQL语句,把多余的‘注释掉,让其消失,那么最后的SQL语句就能正确执行了!
思路:(范围:%81-%FE)
' \' ' ===> 初始状态,转义后的('),作为首尾(')的内容!' 連' ' ===> \消失,但SQL语法错误,不能正确执行SQL语句!注释掉最后一个(') ===> ' 連' ===> SQL语法正确,便能正确执行SQL语句了!
加了(')后,由于开发人员进行了转义,所以程序运行正常!
http://10.1.1.8/sqli-labs-master/Less-32/ ?id=1%df'
加了%df后,开发人员的转义失效,('''),造成SQL语法错误,所以报错!也说明,加了%df起作用了!
SQL语法错误,注释掉最后一个(')使其正确:
http://10.1.1.8/sqli-labs-master/Less-32/?id=1%df'--+
SQL语句正确执行,不报错!
进一步探究使用何种注入方式:
正确执行,页面回显登录名和密码信息!
正确执行,查询不到匹配的条件,页面不回显登录名和密码信息!
结论:根据回显不同信息,可以使用联合查询注入!
1. 字符型注入
2. 获取显示位
http://10.1.1.8/sqli-labs-master/Less-32/?id=1%df' order by 1 --+
......
cookie注入
发现url中没有GET参数,但页面返回正常,还显示Cookie ID set!
BP抓包分析(提交页面):
分析:Cookie中存在id=1的参数,但请求的方式是POST!
修改id=1':
继续尝试:
id 1' and 1=1 --+
id 1' and 1=2 --+
sleep()
....
发现页面都没变化!(提交页面不存在SQL漏洞!)
BP抓包显示页面分析:
结论:存在字符注入,并且是通过cookie的id参数注入!
由于页面回显,存在或不存在信息,使用布尔类型注入!
结论:数据库长度为4!
......
base64注入
XFF注入
下一篇分析 ......