SQL注入
什么是SQL注入?
SQL注入本质:把用户输入的信息当作代码执行
需要满足两个条件:
1. 用户能够控制输入
2. 原本程序要执行的代码,拼接了用户输入的数据然后进行执行
靶场练习——显错注入(一)
显错注入(一)
1. 先确定是否是显错注入
id=1时显示这个结果
id=2时显示不同结果,说明可能存在显错注入
原理:根据传参值的变化页面在不断改变
原因:
1.php代码里写了if等分支语句
2.这个地方从数据库里提取信息然后展露出来
如果一个网站针对id=1,id=2做条件判断再输出,十分繁琐并不便于修改,因此排除第一种情况。
再试试1是不是字符串
发现跟id=2的返回结果一致,说明是显错注入
2. 用order by语句查看有多少字段
当order by 4时发现报错
说明有3个字段
3. 寻找输出点
原理:用union联合查询,使用1=2让前查询语句不执行只执行union之后的查询语句
发现2,3是输出点
运用查找语句从information_schema.tables表中查找table_name列的信息,条件是table_schema和该数据库名相等->获取该数据库的表名(可用limit x,1语句挨个查找我们需要的表)
发现了我们需要的表名error_flag
运用查找语句从information_schema.columns表中查找column_name的信息,增加已知条件table_name=’error_flag’->获取error_flag表中的列的信息(同样可用limit x,1挨个查看列名)
发现第一列列名是id,第二列列名是flag,没有第三列
现在我们知道我们所需要的flag在error_flag表中的flag列中,则
用查询语句直接得到我们的flag
靶场练习——显错注入(二)
显错注入(二)
- 先确定是否为SQL注入
发现id=2页面发生变化说明可能是SQL注入
但id=2-1时页面没有发生变化,说明这里被当作字符串输出了字符串里的第一位2,因此页面没有发生变化
解决办法:先将id值闭合(id=1’),再将后面的(’)用(-- qwe’)注释掉,这样就不会干扰后面的语句执行
- 获取字段数
用order by 语句
发现有三个字段
3. 获取表名
发现第一张表就是我们需要的表,因此得到表名error_flag
4. 获取列名
得到error_flag表第一列为id,第二列为flag
- 得到flag值
靶场练习——显错注入(三)
显错注入(三)
- 判断是否存在sql注入
页面发生变化,说明存在SQL注入
还是老套路需要手动闭合(‘))
再将原本的(‘))注释掉
- 获取字段数
确定3个字段
- 确定注入点
确定后两位时注入点,任选其一
- 获取表名
这里我使用了一个新的语句
group_concat(table_name)
这句话的意思是将table_name列的数据以字符串形式输出
我们得到表名error_flag
5. 获取列名
也用到group_concat()语句,因为特别好用
得到列名flag
- 得到flag
靶场练习——显错注入(四)
显错注入(四)
- 判断是否存在SQL注入
确定存在SQL注入
- 获取字段数
确定3个字段
- 确定注入点
确定后两位是注入点,任选其一
- 获取表名
得到表名error_flag
- 获取列名
得到列名flag
- 得到flag