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> helphelp Show this help messagenew 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 tasklog Retrieve and show log for current taskstatus Retrieve and show status for current taskoption OPTION Retrieve and show option for current taskoptions Retrieve and show all options for current taskstop Stop current taskkill Kill current tasklist Display all tasksversion Fetch server versionflush 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/listorGET http://127.0.0.1:8775/admin/<token>/list刷新工作后盾(删除所有工作)GET http://127.0.0.1:8775/admin/flushorGET 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>/getvalue: [option1, option2, ...]设置特定工作ID的选项值POST http://127.0.0.1:8775/option/<taskid>/setvalue: {option1: value1, option2: value2, ...}启动某个工作POST http://127.0.0.1:8775/scan/<taskid>/startvalue: {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 MsSQL2、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.NET3、hex2char作用:替换0x打头的字符串为CONCAT(CHAR(),...) 模式成果:SELECT 0xdeadbeef SELECT CONCAT(CHAR(222),CHAR(173),CHAR(190),CHAR(239))数据库:MySQL 4, 5.0 and 5.54、modsecurityzeroversioned作用:应用内联正文形式(/*!00000*/)进行注入成果:1 AND 2>1-- 1 /*!00000AND 2>1*/--数据库:MySQL 5.05、space2dash 作用:将空格字符(“”)替换为短划线正文(“--”),后跟随机字符串和新行(“\\n”)成果: '1 AND 9227=9227''1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'数据库:MSSQL SQLite6、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.59、htmlencode 作用:对所有非数字字母的字符进行HTML编码成果:1' AND SLEEP(5)# 1' AND SLEEP(5)#数据库:ALL 10、multiplespaces 作用:围绕sql关键字增加多个空格成果:1 UNION SELECT foobar 1 UNION SELECT foobar数据库: ALL11、space2hash 作用:将‘ ’替换为随机字符串和‘\n'成果:1 AND 9227=9227 1%23upgPydUzKpMX%0AAND%23RcDKhIr%0A9227=9227数据库:MySQL 4.0, 5.012、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数据库: ALL14、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数据库: ALL19、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 * PostgreSQL21、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>1SELECT%C0%A0FIELD%C0%A0FROM%C0%A0TABLE%C0%A0WHERE%C0%A02%C0%BE1数据库:ALL23、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==数据库:ALL26、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数据库:ALL28、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 200530、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)数据库:ALL36、binary 作用:将关键字binary注入能够注入的中央成果:1 AND 2>1 1 AND binary 2>binary 1数据库:MySQL 37、equaltolike 作用:like代替等号成果: SELECT * FROM users WHERE id=1SELECT * FROM users WHERE id LIKE 1 数据库:Microsoft SQL Server 2005 MySQL 4, 5.0 and 5.538、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()数据库:ALL54、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 数据库: ALL59、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签名。
- 对于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 TrueDIFF_TOLERANCE = 0.05CONSTANT_RATIO = 0.9# Ratio used in heuristic check for WAF/IPS protected targetsIPS_WAF_CHECK_RATIO = 0.5# Timeout used in heuristic check for WAF/IPS protected targetsIPS_WAF_CHECK_TIMEOUT = 10# Lower and upper values for match ratio in case of stable pageLOWER_RATIO_BOUND = 0.02UPPER_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...