load_file()可以读取数据库所在计算机上的文件信息
读取计算机上的D盘的4.txt
-1' union select load_file('D:/4.txt'),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17#'
也可以向系统中写入数据信息
-1' union select 'xxx',2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 into outfile 'd:/write.txt'#
后期可以利用这个功能写后门到网站目录下去获取权限
案例分析
将有后门代码的文件写到网站目录下
使用蚁剑进行连接获取网站权限
主要解决的是数据信息没有回显的问题(为了方便测试结结果我还是将sql语句打印了出来)
1.猜取数据库名字的长度
1' and length(database())=7#
我们使用and语句结合前面的1进行查询绕过,数据库长度回显错误,那么就没有内容显示
如果数据库长度正确,那么就会显示1搜索的内容
1' and length(database())=9#
就证明这个数据库库名长度为9位
2.猜数据库的名字,在完全没有提示的情况下,我们需要进行一位一位的字符猜测
使用left函数进行猜解数据名,和上一步一样结合前面的1进行查询,绕过有数据回显证明猜测正确
1' and left(databse(),1)='l'#
依次猜测前两位
1' and left(database(),2)='lo'#
直到猜解完成
1' and left(database(),9)='localhost'#
判断数据库是否存在注入点
正常访问我们可以看见网站的数据库回显是1ms
我们进行延迟注入后是10014ms
1'and if (1=1,sleep(10),0)#
证明存在SQL注入,我们将1=1换成我们需要判断的SQL语句,就可进行延迟注入,例如判断数据库名字的长度或者数据库名字的字母等等来猜测数据库的名字(和上面的手法类似,这里不在演示)
网站的开发者为了保证代码的容错性,往往会采用报错语句去增强代码的健壮性,但是加上这个语句后就可以执行报错注入,我们直接执行报错注入语句就可以获取数据库的信息
1' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)#
在上诉几种注入中,只有时间盲注没有限制,布尔注入需要有数据回显进行判断,报错注入对于源码有一定的要求
在SQL语法中,例如MySQL数据库中的数据,sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔 开,而堆叠注入其实就是通过结束符来执行多条sql语句
例如我们在数据库中执行这样的一个语句
select * from sy_guestbook; create table demo2 like sy_adminuser;
我们先从数据库中的一个表中查询数据,再使用分号,在后面执行一个建表语句
执行后我们可以看到数据库中多了一个demo表,且表的结构和sy_adminuser的结构相同
堆叠注入的使用场景较少
第一步:插入恶意数据 进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据 开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。
二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。 二次注入是sql注入的一种,但是比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到 SQL 查询中,而二次注入则是输入数据经处理后存储,取出后,再次进入到 SQL 查询。
案例分析
我的环境搭建有点问题,使用一下小迪老师上课的例子
在cms中,我们可以创建简历,我们写入信息后,可以在页面中进行展示,也就是我们将数据写入数据库中
我们在查看简历的时候就将数据从数据库中取出,我们可以使用这个条件去获取数据库信息,就形成了数据库二次注入的条件
我们将注入语句写入到简历中,当我们在查看简历时就看到数据库信息
联系地址中出现了数据库的配置信息
我们查看数据库信息就可以 看到数据库语句在我们插入后进行了执行
SQL注入的方式还有很多,例如编码,数据头部参数的注入等等,以及一些工具的学习和使用,需要进一步学习和巩固
如有错误,请及时指出,感谢