SQL注入攻击
概述
- 在服务器向数据库进行数据查询时,不输入正常的数据,输入代码,使数据查询变成代码执行
- sql语言(部分):
- 选取表格中所有内容
1
select * from allusers
- 选取指定的用户名和密码
1
where username = 'QingMaxLim' And passwd = 'passwd'
- where关键字
SQL语句遇到where关键词时,会判断条件是真是假 - 某个神奇的指令
1
DROP DATABASE TABLICE --删除整个数据库
5.SQL合并两个表格的内容:
1
select * from table1 Union select * from table2
报错与注释
- 多’
1 | where username = 'QingMaxLim'' And passwd = 'passwd' |
执行时将’’中的视为字符数据,而不是操作符,此条语句报错,服务器可能将SQL报错信息直接返回给用户
2. ‘后有–
1 | where username = 'QingMaxLim' -- ' And passwd = 'passwd' |
系统会认为 – ‘ And passwd = ‘passwd’是注释
此时不知道密码也可以进行账户登陆,直接绕过密码验证条件(不返回)
3. if不知道用户名
true OR false = true
于是————
1 | where username = 'QianliGrass' Or 1=1 -- ' And passwd = 'passwd' |
该语句为真(即使用户名错误)
UNION
- UNION后不指定表格名字,使用NULL代替列名
1 | select * from table1 Union select NULL,NULL |
UNION操作必须保证合并两边的列数一致
于是————可以用NULL测试列数(最后多少个NULL是返回成功的结果)
2. 如果已知另一个表格的信息,则可以将表格的列名放在NULL的位置,并指定选取的表格名
UNION还需保证数据类型相似
所以还需确定数据类型(例如逐列测试)
3. 最后——
1 | select * from allusers |
布尔和时间延迟
- cookie与布尔
在数据库里会保存不同用户的Cookie,用户登陆网页会在http请求里加上cookie这个http首部,会生成服务器向数据的查询语句(如select,from,where)
修改cookie中的值- 强行加上一个单引号结束字符数据,并注释掉后面的SQL语句,如果返回的还是原来的页面,则证明是可以被注入的
- 在后面添加使where语句变错的条件(查询不到要查询的内容),如果此时返回的页面内容改变了,则可以知道能查询和查询不到的页面分别是什么
- 修改条件来验证想要测试的内容(使用substring方法判断,例子中判断第一个字符是否为p),如果是,返回正常页面,如果不是,则返回不一样的页面
- 如例子,已知用户名admin,信息保存在users表中,接下来就是修改条件并进行测试(暴力破解-盲注)
1 | select cookield from allusers |
- 时间延迟
使用sleep函数,比如sleep(10),如果页面在10s左右返回内容就是猜中,如果页面正常返回,且在10s内,就是没猜中
带外通道
- 向MySQL系统注入LOAD_FILE()函数,如果给这个函数提供域名,则触发DNS查询,即查询域名的IP地址,此时将要查询的管理员密码和域名进行拼接,相当于直接向攻击方发送管理员密码(攻击方可以看到DNS查询内容)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 QingMaxLim-Blog!