sql注入原理:web应用程序对用户的输入没有进行合法性的判断,前端传入后端的参数是攻击者可控的,并且带入了数据库查询,导致攻击者可以构造不同的sql语句实现对数据库的任意操作。
两个必要条件:1.参数用户可控
2.参数带入数据库查询
mysql与sql注入漏洞相关知识点:
mysql5.0版本后,mysql默认在数据库有一个information_schema库,其中有三张表需要记住,
1.schemata 存放了所有数据库的库名 schema_name
2.tables 存放了所有数据库的库名及相对应的表名 table_schema,table_name
3.columns 存放了所有数据库的库名及相对应的表名和字段名 table_schema,table_name,column_name
mysql查询语句
select 要查询的字段名 from 库名.表名 (不知道任何条件情况下)
select 要查询的字段名 from 库名.表名 where 已知条件的字段名=‘已知条件的值’ (知道一条已知条件)
select 要查询的字段名 from 库名.表名 where 已知条件1的字段名=‘已知条件1的值’ and 已知条件2的字段名=‘已知条件2的值’
limit的使用格式为 limit m,n
m为起始位置,n为取n条记录,如limit 0,1,即从第一条记录开始,取一条记录。
三个重要函数 database(),version(),user()
注释符,# --空格 /**/
内联注释/*!code*/
攻击方式:
1.给可控参数添加单引号,and 1=1,and 1=2.试过后基本就存在sql注入,之后可采取order by 1-99语句查询该数据表的字段数量。
如该数据表字段数量为3,输入id=1 order by 3 反馈结果和id=1 order by 4反馈一样的结果而id=1 order by 4反馈结果不同,则字段数为3
2.union注入攻击:进行1步骤后,union select 1,2,3 判断在1,2,3中可以输入sql语句的位置,然后即可插入sql语句进行查询
3.boolean注入攻击:针对只反馈yes或no结果的页面,即返回的结果不会存在数据库的数据,只是特定的正确或错误
那么可以试图判断数据库名的长度
‘ and length(database())>=1 --+
类推,可以根据页面反馈的正确和错误来判断是否猜对数据库名长度
当猜对长度后,可以试图猜数据库名的名字
如用
' and substr(database(),1,1)='t' --+ 意思是截取database()的值,从第一个字符开始,每次只返回一个。这个和limt不一样,这里从1开始排序
可以采取burp爆破的方式
也可以采用ascii的字符查询,假如database()数据库名第一个为s,s对应ascii码值为115那么
' and ord(substr(database(),1,1))=115 --+即可判断是否正确,ord是将字符转换为ascii码值
4.报错注入攻击,没看懂,暂时略,页面报错之后用的查询语句看不懂
5.时间注入攻击:即利用sleep()或benchmark()等函数让MySQL的执行时间变长,从而通过判断反馈时间来判断是否存在注入。
通常与if语句结合使用,IF(expr1,expr2,expr3) 含义为如果expr1为真,则返回expr2;否则返回expr3.
如判断数据库库名长度的语句为:
if (length(database())>1,sleep(5),1) 意思是如果数据库长度大于1,则mysql查询休眠5秒,否则查询1.
6.堆叠查询注入攻击:多语句之间以分号隔开,如
';select if(substr(user(),1,1)='r',sleep(3),1)%23
7.二次注入攻击:两个不同页面结合起来,通过注册页面注册用户如将test'注册到数据库里,虽然开始转义了,但是后来通过参数id页面读取时,读取到数据库里的
用户test',带入sql语句查询导致多了一个单引号出错。
8.宽字节注入攻击:当传入1'时,单引号被转移符(反斜线)转义,一般情况下是不存在sql注入漏洞的,但是有一个特例,当数据库编码为GBK时,可以使用宽字节注入
即用%df和反斜线的编码%5c结合起来为繁体字连。则单引号成功逃逸,报出数据库错误
而后可以进一步判断注入,
1%df' and 1=1%23
1%df and 1=2%23
接着用order by查数据库表字段数量,再结合union注入
9.cookie注入攻击:修改cookie中的参数尝试攻击
10.base64注入攻击:base64编码尝试绕过waf
11.XFF注入攻击:通过burp抓包后可以看到http请求头中有一个头部参数X-Forwarded-for,简称XFF头,它代表客户端真实的ip地址,通过修改它的值来进行攻击
如将它设置为127.0.0.1' and 1=1#
sql注入绕过技术
1.大小写绕过
2.双写绕过
3.编码绕过,如base64,url全编码(和url普通编码不一样)而且是编码两次
4.内联注释绕过注入:
如id=1 /*!and*/ 1=1