
SQL注入原理
一、判断SQL注入漏洞
参数带入数据库查询:传入的参数拼接到SQL语句,然后写入数据库查询。
例如:用户传入的参数为
1':select * from users where id=1'
因为这个SQL语句不符合语法规则,所以导致报错(有报错就说明有可能存在SQL注入漏洞)
判断原理
当用户传入的参数为
1 and 1=1
时(select * from users where id=1 and 1=1
)因为
1=1
为真,id=1
也是真,也就and
两边同真(与运算),所以页面会返回id=1
的结果。如果用户传入参数为
1 and 1=2
的时候,因为1=2
为假,id=1
为真,也就是and
两边有一个为假,所以页面就会返回和id=1
不一样的结果。根据这些结果,就大概可以判断存在SQL 注入漏洞。然后我们就可以进一步拼接SQL攻击语句来进行攻击,造成对方信息泄露,甚至获取到服务器的权限。
常用判断语句:根据页面回显的信息进行判断
id =1 and 1=1
id = 1 and 1=2
id = 1 or 1=1
id = '1' or '1'='1'
id=" 1 "or "1"="1"
为了演示方便,先在数字型注入里查看一下用户名,然后在字符型(用户名是字符型)注入里传参进行判断
用单引号判断,发现报错,则可能存在注入
也可以通过传参进行判断:
lucy'and '1'='1
:后面不加引号是因为页面里会拼接SQL语句;输入lucy'and '1'='2
就发现页面会有相应变化
无回显情况判断是否存在注入:根据输入的语句,页面没有发生任何变化,或者没有将数据库中的内容显示到网页中
可以用sleep()来判断是否可以注入
lucy'and sleep(5)--
(注意:--后面要加一个空格),发现页面没有任何变化sleep(5)
:大于5秒再返回页面--
:用注释符注释页面拼接的单引号和后面的查询语句
二、注入流程概述
先判断是否存在注入,然后判断注入类型
判断字段数:
order by
确定回显点:
union select 1,2
查询数据库信息:
@@version @@datadir
查询用户名:user()
查询数据库名:
database()
文件读取:
union select 1,load_file('C:\\wondows\\win.ini')#
写入 webshell:
select..into outfile...
使用 sql 注入遇到转义字符串的单引号或者双引号,可以用HEX编绕过