这是两道题目的WP合集,由于我只打了这两道题,所以就不分开写了(丢人)
继续阅读【NahamconCTF】 Personnel and Flaskmetal Alchemist
分类: SQLI
【SQLI】SQLI攻击与防护
SQL注入
约有如下13种:
-
Boolean盲注
与时间盲注类似,但是用于有明显回显情况
-
Union注入
最常见的注入方式之一1' union select 1,2,database() --+
-
文件读写
select '' into outfile '/var/www/c.php' --+
-
报错注入
floor()、extractvalue()、updatexml()、geometrycollection()、multipoint()、polygon()、multipolygon()、linestring()、multilinestring()、exp()
-
时间盲注
sleep()
-
REGEXP正则匹配
PCRE绕过:union/‘+’a’1000001+’*/select
-
宽字节注入
运用GBK与UTF-8编码不同来绕过转义
-
堆叠注入
两句代码以分号等方式隔开:select * from users where id=1;select 1,2,3;
-
二次注入
巧妙利用update等方式,用已有的数据进行注入
-
User-Agent注入、11.Cookie注入
10,11两种其实只是个注入位置的区别而已,可以采用Burp或者直接Curl构造payload实现
-
过滤绕过
union绕过,双写绕过,注释绕过等
-
万能密码
admin’ or ‘1’=’1
username = secpulse’=’ password = secpulse’=’
ffifdyop
SQL防护
-
预编译
String sql="select id,no from user where id=?"; PreparedStatement ps=conn.prepareStatement(sql); ps.setInt(1,id); ps.executeQuery();
采用了PreparedStatement,就会将sql语句:”select id, no from user where id=?” 预先编译好也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。
所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行,必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。
所以sql语句预编译可以防御sql注入。 -
PDO
也是一种预编译的方式,常用在PHP的数据库查询上,绑定的参数不需要使用引号,也可以有效防止注入
-
正则表达式过滤
实在不行,那就自己写过滤!