![c137a39a50fda29165c37c42932a8c32.png](https://i-blog.csdnimg.cn/blog_migrate/fb68da8c93ad052a601ced5d38fe441d.jpeg)
3.1常见的sql注入利用技术
3.1.1使用堆叠查询
堆叠查询指的是在单个数据库连接中执行多个查询。
3.2识别数据库
3.2.1 常见系统架构组合识别
Asp和.net通常使用sqlserver
Php通常使用mysql或者postgresql
Java通常是oracle或mysql
Iis服务器是基于windows的架构,后台数据库有可能是sqlserver
Apache服务器,可能使用开源数据库mysql或postgresql
3.2.2 非盲跟踪
大多数情况下想识别数据,只需查看一条足够详细的错误信息即可。不同数据库错误信息也不同。
例如:添加一个单引号使数据库报错。
![5e794bf99cbc6e1f024a6cd68a1a8940.png](https://i-blog.csdnimg.cn/blog_migrate/086e135379efdb247ed5826ad1c08504.png)
通过报错信息,就能很轻易判断出是mysql数据库。
![c263f3bc4f2d572919815fe56540b479.png](https://i-blog.csdnimg.cn/blog_migrate/bd920b958a361025ab988f70e5e88ed1.jpeg)
如果出现类似错误说明。服务端代码没有对数据库查询语句进行错误判断。这样是非常危险的,直接将服务器文件目录返回给了用户。
进行错误判断的代码实列:
![690c6a52035b23c7451618b92d842e45.png](https://i-blog.csdnimg.cn/blog_migrate/cd3f71798f19b9b7d082cc0268185f07.png)
其他类型数据库报错信息,如果自己无法判断,google搜索一下,就可以查询到。
3.2.2.1 获取标志信息
从错误信息中,我们可以获取很多的数据库信息,但是这样还不够。
我们可以使用数据库查询函数进行,更多的查询。
![6a769240fe5e8922b53509b71c93f040.png](https://i-blog.csdnimg.cn/blog_migrate/91f74a97a7ddfb9c74e72cb19d9584c0.jpeg)
例如:对于mysql数据库,执行select version();
![f97222d9cff6a032bb7e05df9d970276.png](https://i-blog.csdnimg.cn/blog_migrate/59a119dec52462f89b61f9c7fe6923c6.jpeg)
即可查看数据库版本。还可以进一步查看用户,用户权限等等
3.2.3 盲跟踪
如果应用不直接返回你所需 的数据,就需要采用其他方法。这种方法基于不同数据库所使用的sql语句上的细微差异。最常用的技术就是利用不同数据库在连接字符串上的差异。
3.2.3.1 连接字符串判断数据库
![90851727b9b12b379d24122bae9ba9ce.png](https://i-blog.csdnimg.cn/blog_migrate/84cfbdd4a0c1556fe1b776837f1e18b5.png)
该查询对大多数数据库,查询结果都一致,当如果将字符串分成两个字串,不同产品会有不同结果。
![d75355c6bf64a229811ff76d8345f8de.png](https://i-blog.csdnimg.cn/blog_migrate/bb08bfa3ebab4dc1b43ab8a2027f50a9.jpeg)
3.2.3.1 针对mysql数据库:
1. select concat('str','ing')
![c808116b2f92a6187c34ced2b062a522.png](https://i-blog.csdnimg.cn/blog_migrate/cef02a42e19568642feea2f6ed598fd8.jpeg)
使用concat()函数时,需为数字型注入
![6fe692d499e9e2652a8fe98f9dc8c241.png](https://i-blog.csdnimg.cn/blog_migrate/231df1ddb408e85c796c037a3461e3e7.png)
2. select 'str' 'ing'
![d9200efcfdf54f7fac35a01490f72f5f.png](https://i-blog.csdnimg.cn/blog_migrate/1419daf3b4aca86000f3711dc4486544.jpeg)
构造payload过程中需时刻注意闭合问题。
3.2.3.2 数字函数判断数据库
![651e4a9ebeddc70e6f6acb7f23f8fbfb.png](https://i-blog.csdnimg.cn/blog_migrate/dbe34213da1231fce40d58711c2ca322.jpeg)
3.2.3.3 使用特定的sql结构
面对mysql可以使用三种不同的方式来包含注释。
1)#
2)--
3)/**/
针对第三个注释如果在第一个*后面加一个!,后面再跟上数据库版本编号,那么该注释将被解析成带代码。
例如:
select 1 /*!40119 + 1*/
返回结果:
2(如果mysql版本为4.01.19或更高版本)
1(其他情况)
这里我版本为5.5.53。只能返回1.