这段实习的学习过程学会了很多东西,其中最让我感兴趣的就是SQL注入了,因为这是一种主动攻击,可以当场就能判断攻击是否生效。
Structured Query Language (SQL)
SQL注入的原理:将未被正确过滤、验证或转义的用户提供的输入提交到服务端,从而使攻击者能够执行恶意的SQL查询或篡改数据库的操作。学习SQL注入之前,要先会一些基本的SQL查询语句。否则很难理解SQL语句查询过程和为什么会产生SQL注入。
学习的时候练习靶场就是sqli-labs,sqli-labs 是一个用于学习和实践 SQL 注入漏洞的开源项目。它提供了一系列不同难度级别的关卡,让用户能够逐步学习和掌握 SQL 注入技术。
sql注入过程:找到注入点--判断注入类型--爆库名--爆表名--爆列名--查到你想要的数据
一个用户在被创建时会自动生成一个数据库information_schema,其中存放的就是数据库名,表名,和表对应的列名
information_schema数据库下有三张表会经常用得到:
1.information_schema.schemata(schema_name) schema_name存放数据库名
2.information_schema.tables(tables_schema,table_name) table_schema存放表所在的数据库名,tables_name存放表名
3.information_schema.columns(tables_schema,table_name,column) table_schema存放表所在的数据库名,tables_name存放表名,columns_name存放该表的列名
当前数据库名有时可以直接调用database()函数得到
UNION注入过程
1.找到注入点,一般常见的注入点是发送get请求时,网址后面跟的参数,从参数中去找。
2.判断注入类型时数字型还是字符型。
3.找到闭合条件,使sql语句在能插入一些其他语句时,页面能正常显示。
4.使用 order by 1~n 查看页面查询结果的列数,当n+1为某个值时页面开始出错,说明n就是页面查询结果的列数(因为 union 前后查询语句的列数必须一直,否则会报错)
5.使用 union select 1,2,3,...,n 查看页面的显示位,显示的数字是几,后面插入的查询语句就放在哪个位置上
6.union查询:sql1 and 0 union select 1,sql2,3(sql2所在的位置是显示位)
这里需要先把union前面的union语句置为假,显示的结果才会是union后面的查询,在这里就可以查询你想查询的内容了
示例
sqli-labs/less1
1.根据经验找到注入点和页面查询结果的列数,这里发现是3
2.查看显示位,这里发现2,3的位置都能显示
3.查看数据库名,database()函数(一般确定一个网站有sql注入漏洞,到这一步就够用了)
4.接下来就是根据数据库的名字查询表名和每个表的列名
接着做到union能解决的sql注入
sqli-labs/less2
输入?id=1/1和?id=1/0时,发现后者不能正常显示页面,推断是数字型注入
直接order by 3,然后union select 1,2,3--+
sqli-labs/less3
字符型注入,闭合条件为‘)
sqli-labs/less4
小结
union注入是一种显注手段,要求当前页面有显示位来使你查询的内容显示到页面上,如果没有显示位,那么就不能利用union注入来获取数据库中的数据。