这篇文章给大家介绍SQL注入原理及代码分析是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计制作、成都网站建设、达孜网络推广、微信小程序开发、达孜网络营销、达孜企业策划、达孜品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供达孜建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com
我们都知道,学安全,懂SQL注入是重中之重,因为即使是现在,SQL注入漏洞依然存在,只是相对于之前现在挖SQL注入变的困难了。而且知识点比较多,所以在这里总结一下。通过构造有缺陷的代码,来理解常见的几种SQL注入。下面只是讲解几种注入原理,没有详细的利用过程。
SQL注入漏洞的产生需要满足两个条件
参数用户可控:前端传给后端的参数内容是用户可以控制的。
参数带入数据库查询:传入的参数拼接到SQL语句并带入数据库查询。
所以在实际环境中开发者要秉持“外部参数皆不可信原则”进行开发。
先看代码
"; ?>
在union注入页面中,程序获取GET参数id,对用户传过来的id值没有进行过滤,直接拼接到SQL语句中,在数据库中查询id对应的内容,并将这一条查询结果中的user和password 输出到页面。进行union注入攻击前提是页面有回显。
然后就是注入的常规思路,判断类型,判断字段数,使用union查询相关数据。
先看代码
在布尔盲注页面中,程序先获取GET参数id,通过preg_match()函数判断其中是否存在union sleep benchmark等危险字符。然后将参数id拼接到SQL语句,从数据库查询,如果有结果,返回yes,否则返回no。所以访问这个页面,代码根据查询结果返回只返回yes和no,不返回数据库中的任何结果,所以上一种的union注入在这里行不通。尝试利用布尔盲注。
布尔盲注是指构造SQL判断语句,通过查看页面的返回结果来推测哪些SQL判断是成立的。例如,我们可以判断数据库名的长度构造语句如下。
and length(database())>=1 #依次增加,查看返回结果
通过上面的语句我们可以猜到数据库名长度为4。
接着使用逐字符判断的方式获取数据库库名,数据库库名范围一般都是a~z,字母0~9。构造语句如下。
and substr(database(),1,1)=要猜解的字母(转换成16进制)
substr是截取的意思,构造语句的含义是,截取database()的值,从第一个开始,每次返回一个。这里要注意,要和limit语句区分开,limit从0开始排序,substr从1开始排序。因为我知道数据库的第一个字母是d,所以直接换成d,转换成16进制就是0x64。结果如下。
在真实环境中,自己手工的话,工作量有点大,可以借助burp的爆破功能爆破要猜解的字母。
同样,也可以利用substr()来猜解表名和字段。构造语句
and substr((select table_name from information_schema.tables where table_schema=库名 limit 0,1),1,1)=要猜解的字母(这里指表名)
用这样的方法,可以猜解出所有的表名和字段,手工会累死,可以借助burp或者sqlmap。
先看代码
查看代码,在报错注入页面中,程序获取GET参数id后,将id拼接到SQL语句中查询,如果执行成功,就输出ok,如果出错,就通过echo mysqli_error($con)将错误信息输出到页面。我们可以利用这种错误回显,通过updatexml()、floor()等函数将我们要查询的内容显示到页面上。
例如,我们通过updatexml()获取user()的值,构造如下语句。
and updatexml(1,concat(0x7e,(select user()),0x7e),1) #0x7e是~16进制编码
发现查询出了user()的值
同样,我们也可以查询出database()的值
and updatexml(1,concat(0x7e,(select database()),0x7e),1) #0x7e是~16进制编码
查询出了数据库名
我们可以用这种方法查询出剩下的所有表名和字段,只需要构造相关的SQL语句就可以了。
先看代码
no