LOW
LOW级别没有对输入参数进行任何检查过滤,直接插入sql语句查询,存在很大的注入漏洞。
首先依次使用以下语句可以判断为字符型注入。
输入1
输入1’ and ‘1’=‘1
输入1’ and ‘1’=‘2,查询失败,由此可以说明存在字符型注入。
使用union猜解sql查询语句中的字段数 1’ union select 1,2#,使用其他语句如1‘ union select 1#和1’ union select 1,2,3#都报错The used SELECT statements have a different number of columns,说明查询字段只有两个,分别为First name和Surname.,查询语句大致为selec First name ,Surname from xxx where ID="id’; (xxx为表名)
为获取表名,先查询数据库,为dvwa
查询到数据库dvwa只有两个表
获取users表的列名,并查询users表内容
MEDIUM
Medium级别使用了mysqli_real_escape_string对参数id进行过滤,转义其中可能含有的\x00,\n,\r,,’,",\x1a ,并且只能通过下拉菜单选择id。但是我们仍可以对传输过程的数据进行篡改。
首先抓包修改参数,报sql语法错误。
修改参数为1 or 1=1#,查询成功,说明为数字型注入漏洞。
同样的,判断查询语句的字段数,使用1 order by 3 报错,说明查询语句只有两个字段。
确定字段顺序,修改参数为1 union select 1,2#,说明字段顺序为First name,Surname。sql查询语句为select First name,Surname from xxx where ID=id。接下来确定表名xxx。
依次使用以下语句爆出数据库名,表名.
1 union select 1,database() #
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
爆出表名之后,由于后台对引号进行了转义,所以需要对表名进行编码处理。
1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #
查询users表的内容。
HIGH
high级别主要存在的是字符型注入漏洞,相比medium添加了limit 1试图限制只输出一个结果。但是同样可以通过注释绕过。
注入过程与LOW级别的基本一致,直接最后一步修改id参数即可爆破。
IMPOSSIBLE
IMPOSSIBLE级别使用了Anti-CSRF 的方法防止了csrf攻击,并使用预编译和PDO将sql查询参数和语句分隔开,只有在查询结果为1个时才能正常显示。