1、sql注入原理
通过构造(拼接到原本语句之后)不同的sql语句来实现对数据库的操作。
2、sql注入的种类
联合注入、POST注入/HEAD注入、盲注、宽字节注入、
Access注入——cookie注入、Access注入——偏移注入、
Mysql注入——Dns注入、Mysql注入——反弹注入、
Oracle注入——报错注入
3、sql注入一般流程
判断注入点
判断字段数
判断回显点
查询相关内容
(1)判断注入点
与数据库产生交互的地方,是否有漏洞可以进行sql注入,如异常语句(and 1=2 或 and sleep(3)),导致页面显示出错
注入点类型:
数字型【传的参数直接是数字】,id=1 and 1=2报错,id=1 and 1=1正常,则说明存在数字型注入点;
字符型【传的参数被'XXX'包起来了,一般拼接 and 1=2 后,页面依旧显示正常】,id=1' 报错,id=1' -- zhushi 正常,则说明存在字符型注入点;
逃脱'':
构造出成对的'';
添加注释 -- abc、--+;
%23(mysql中的注释符是#,编码问题,需要使用%23代替#);
在url访问中 + 会被转义为空格,即可用+代替空格;
(2)判断字段数
order by 10——表示按第10个字段排序,若没有这么多字段会报错,可以根据是否报错,判断出字段数。
联合查询(union select)是将前后2张表的内容合并到一起后输出,所以需要保证前后表的查询字段数一致,所以要判断字段数,且查询结果正常情况下是多行,所以要构造查询出自己想要显示的内容(如union前面查询结果出为空,或limit 0,1限制)
select a,b,c from table_A union select *,1 from table_B【B表有2个字段,字段数不足时,可以补足】
(3)判断回显点
显示数据库内容的地方,能显示出自己需要查找的信息,如账号密码信息
(4)查询相关内容
如查询数据库名、表名、字段名、账号、密码。
可能使用到的mysql函数、语句:
database()
version()
sleep()
exists()
ordery by 2
union select 1,2
limit 0,1
limit 1,1
select schema_name from information_schema.schemata limit 0,1
select table_name from information_schema.tables where table_schema=database() limit 1,1
select column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 0,1
limit n,m--》即显示从第n+1行开始及其以后的m行查询出的结果【查询结果行数从0开始计】
4、access联合注入及判断回显点
在mysql中and 1=2 union select 1,2
【为了让union后面查询的内容显示出来——只能显示一行结果】
在access中 union select * from table_name【access数据库语法要求添加表名】
判断是不是猜测表、猜测字段,exists(select username,password from user)进行判断,若显示正常,则猜测的表名、字段名正确———可以整理一些常用的表名及其字段名
5、判断是否可cookie传参
常用get/post方法传参,对于一些敏感字符进行了过滤,如and、union、select、limit、order by等;但有时也可以使用cookie传参,有时cookie传参未过滤/拦截敏感字符。
删除url中的参数,刷新页面访问时报错;但将url的参数放置到cookie中,刷新没有url参数的页面,访问正常,说明可以使用cookie传参,可以将敏感字符拼接到cookie中查询数据库信息。