Compare commits

...

231 Commits

Author SHA1 Message Date
Miroslav Stampar
295cd15dff Version bump related to the merged pulls 2021-06-08 14:05:05 +02:00
Stefan Pejcic
3463341bad link to rs translation (#4692) 2021-06-08 14:04:03 +02:00
Stefan Pejcic
88553d3540 rs translation (#4691) 2021-06-08 14:03:52 +02:00
Pham Sy Minh
ab90447600 Update README-vi-VN.md (#4701) 2021-06-08 14:02:38 +02:00
Miroslav Stampar
a23faaeb8c Patch related to #4693 2021-05-31 00:34:14 +02:00
Miroslav Stampar
6942abf090 Minor update 2021-05-27 12:29:40 +02:00
Miroslav Stampar
3c25f79a9b Fixes #4671 2021-05-25 14:40:15 +02:00
Miroslav Stampar
94ab17829e Fixes #4688 2021-05-25 09:01:41 +02:00
Miroslav Stampar
c4c1571902 Making sqlmap compatible with PyPy/PyPy3 2021-05-24 13:49:35 +02:00
Miroslav Stampar
da86486cd9 Couple of minor patches 2021-05-24 13:12:18 +02:00
Miroslav Stampar
dccc837703 Minor update 2021-05-19 18:32:03 +02:00
Miroslav Stampar
452915ed4a Minor update 2021-05-19 18:20:39 +02:00
Miroslav Stampar
35e575c287 Minor update 2021-05-17 10:43:58 +02:00
Miroslav Stampar
015a8f0a6d Fixes #4678 2021-05-17 10:40:27 +02:00
Miroslav Stampar
0896a49500 Minor update 2021-05-12 13:14:13 +02:00
Miroslav Stampar
95511c8ff9 Fixes #4659 2021-05-01 13:25:00 +02:00
Miroslav Stampar
8bf1650d65 Fixes #4664 2021-05-01 11:40:42 +02:00
Sutrisno Efendi
ff645a767b Update README-id-ID.md (#4663) 2021-05-01 11:33:14 +02:00
Miroslav Stampar
cfa7b3c3bd Implements #4656 2021-04-28 18:06:15 +02:00
Miroslav Stampar
76b310cc43 Fixes #4650 2021-04-25 20:36:19 +02:00
Miroslav Stampar
9a6acd2054 Fixes #4637 2021-04-13 17:55:54 +02:00
Miroslav Stampar
387020ece8 Better yet for #4633 2021-04-09 11:43:01 +02:00
Miroslav Stampar
732b9670d2 Minor fix related to last commit 2021-04-05 19:00:35 +02:00
Miroslav Stampar
1159c9ccae Fixes #4629 2021-04-05 18:38:47 +02:00
Miroslav Stampar
cadbf170f0 Fixes #4630 2021-04-05 18:21:09 +02:00
Miroslav Stampar
fc486c8b34 Minor update 2021-04-02 13:55:37 +02:00
Miroslav Stampar
cfe43e3f2b Patch for #4626 2021-04-02 12:56:31 +02:00
Miroslav Stampar
6395481aa4 Fixes #4625 2021-04-02 12:47:03 +02:00
Miroslav Stampar
2380ab1e86 Dummy patch for #4623 2021-03-31 10:42:40 +02:00
Miroslav Stampar
dd32bfb0cc Minor patch for #4613 2021-03-28 21:41:45 +02:00
Daniel Igarashi
b7d90bbe03 Correct a typo (#4619) 2021-03-28 20:01:21 +02:00
Miroslav Stampar
86170e177c Dirty patch for #4618 2021-03-28 19:58:06 +02:00
Miroslav Stampar
bce3abc829 Fixes #4612 2021-03-25 17:29:14 +01:00
Miroslav Stampar
8d6125f067 Minor patch 2021-03-22 12:00:32 +01:00
Miroslav Stampar
506e3f0871 Fixes #4611 2021-03-22 11:03:57 +01:00
Miroslav Stampar
6145944dc7 Fixes #4609 2021-03-18 11:40:39 +01:00
Miroslav Stampar
61186b979b Update THANKS.md 2021-03-16 10:11:23 +01:00
Miroslav Stampar
4d4b9a1175 Potential (hide the cause) patch for #4367 2021-03-15 23:02:31 +01:00
Miroslav Stampar
133e2c8c61 Trivial update 2021-03-11 21:31:28 +01:00
Miroslav Stampar
38c341076d Update regarding #4142 (--auth-type bearer) 2021-03-11 20:41:05 +01:00
Miroslav Stampar
40e4422bbd Trivial cosmetics (breaking help into two lines) 2021-03-11 20:14:36 +01:00
Bernardo Damele A. G
98ac1cf9c1 Update FUNDING.yml 2021-03-11 18:11:28 +00:00
Bernardo Damele A. G
56721240fa Update FUNDING.yml 2021-03-11 17:22:58 +00:00
Bernardo Damele A. G
c81414cf25 Update FUNDING.yml 2021-03-11 15:41:21 +00:00
Bernardo Damele A. G
2e195a35dc Create FUNDING.yml 2021-03-11 15:38:12 +00:00
Miroslav Stampar
89d25a16ce Trivial patches 2021-03-11 11:11:29 +01:00
Miroslav Stampar
9bc466edac Removing deprecated piece of code 2021-03-11 11:02:23 +01:00
Miroslav Stampar
32b7f3040e Trivial consistency update 2021-03-11 11:00:38 +01:00
Miroslav Stampar
f066e215e5 Minor patch 2021-03-11 10:55:09 +01:00
Miroslav Stampar
4e65ff4689 Proper patch for #4591 2021-03-08 15:40:05 +01:00
Miroslav Stampar
1e8bf1c78a Trivial update for #4595 2021-03-07 21:22:17 +01:00
Miroslav Stampar
657c6519ea Graceful fail for --gui (#4601) 2021-03-07 21:15:59 +01:00
Miroslav Stampar
970c7f6a76 Fixes #4599 2021-03-07 20:35:51 +01:00
Miroslav Stampar
105e314ec8 Fixes #4596 2021-03-07 20:31:11 +01:00
Miroslav Stampar
dd963a042d Fixes #4591 2021-03-04 08:26:23 +01:00
Miroslav Stampar
0df2592622 Trivial speedup 2021-03-03 23:28:27 +01:00
Miroslav Stampar
eeacab0f19 Speedup of caching for char encoding (non-Unicode chars in page) 2021-03-03 23:08:00 +01:00
Miroslav Stampar
b3e454d0b1 Trivial update 2021-02-25 12:19:08 +01:00
Miroslav Stampar
99d0031d65 Minor update 2021-02-25 11:39:08 +01:00
Miroslav Stampar
5916bc2d39 Minor update 2021-02-25 11:22:10 +01:00
Miroslav Stampar
2159944de4 Minor update 2021-02-23 12:00:59 +01:00
Miroslav Stampar
f87aa83e9b Dirty implementation for #4571 2021-02-21 22:49:57 +01:00
Miroslav Stampar
b902cca791 Minor update 2021-02-19 11:38:02 +01:00
Miroslav Stampar
86467e196b Periodical recloak 2021-02-19 11:08:14 +01:00
Miroslav Stampar
30f137699d Trivial bug patch 2021-02-19 11:07:13 +01:00
Miroslav Stampar
7741154383 Fixes #4580 2021-02-16 14:27:02 +01:00
Miroslav Stampar
a6262a3aa9 Adding support for Virtuoso DBMS 2021-02-15 14:07:36 +01:00
Miroslav Stampar
1f33b16e01 Fixes #4579 2021-02-14 14:47:28 +01:00
Miroslav Stampar
04396c97e2 Minor refactoring 2021-02-11 13:00:54 +01:00
Miroslav Stampar
b1cdbdae61 Minor update of tests 2021-02-11 12:30:21 +01:00
Miroslav Stampar
747951b80b Another patch for #4576 2021-02-10 14:09:13 +01:00
Miroslav Stampar
1bef2f8fda Fixes #4576 2021-02-10 14:02:42 +01:00
Miroslav Stampar
b0ac442096 Minor patch of links 2021-02-08 22:42:08 +01:00
Miroslav Stampar
99a5fb243c Trivial update 2021-02-08 21:50:20 +01:00
Miroslav Stampar
b2a575482e Proxies dislike non-browser user-agents 2021-02-08 21:47:36 +01:00
Miroslav Stampar
365e08b710 Allowing empty database names in -d 2021-02-08 20:47:37 +01:00
Miroslav Stampar
af3b79ff8b Trivial update of doctests 2021-02-08 12:28:24 +01:00
hugoduar
3724a53466 Add spanish common names (#4573) 2021-02-08 11:30:39 +01:00
Miroslav Stampar
01e83cb4a0 Minor patch for ws 2021-02-08 11:18:27 +01:00
Miroslav Stampar
cd77cdd1e8 It seems that JSON_GROUP_ARRAY is not available in all Travis CI deployments 2021-02-05 15:15:58 +01:00
Miroslav Stampar
22c421a427 Debugging the testing case 2021-02-05 14:46:23 +01:00
Miroslav Stampar
59fe89f076 Minor update of testing cases 2021-02-05 12:44:39 +01:00
Miroslav Stampar
160011bd87 Couple of bug fixes 2021-02-03 11:52:50 +01:00
Miroslav Stampar
36ee4d68c7 Trivial update 2021-02-01 22:19:20 +01:00
Miroslav Stampar
dfc5bc5d87 Minor update of testing cases 2021-02-01 21:58:36 +01:00
Miroslav Stampar
d247fda9d3 Fixing HTTP chunking for Python2.6 2021-02-01 21:34:26 +01:00
Miroslav Stampar
78b1c4f072 Trying to fix the mess with content_length between versions 2021-01-31 16:08:02 +01:00
Miroslav Stampar
63e44f9ee9 Trying to debug the Travis CI issue 2021-01-31 14:44:02 +01:00
Miroslav Stampar
08349138ec Bug fix (--chunked failing on TravisCI) 2021-01-31 14:00:44 +01:00
Miroslav Stampar
807d38688f Trivial update 2021-01-29 14:49:08 +01:00
Miroslav Stampar
0975fb1226 Minor update 2021-01-29 14:46:15 +01:00
Miroslav Stampar
71c141ef86 Minor patch 2021-01-29 14:38:13 +01:00
Miroslav Stampar
accfbf958e Fixes #4560 2021-01-27 14:01:20 +01:00
Miroslav Stampar
c0be1da8b1 Capture deprecations even in nightly Python builds 2021-01-21 10:14:24 +01:00
Miroslav Stampar
4a12493d85 Python3 fix (parsing of headers) 2021-01-20 16:29:52 +01:00
Miroslav Stampar
b2c8ba10cd Minor just in case update 2021-01-20 16:06:19 +01:00
Miroslav Stampar
9568ee3c4d Fixes #4548 2021-01-19 12:32:32 +01:00
Miroslav Stampar
f3e8039145 Fixes #4549 2021-01-19 12:25:03 +01:00
Miroslav Stampar
e5086ef61a Fixes #4545 2021-01-18 12:29:35 +01:00
Miroslav Stampar
ed0909fe57 Fixes #4547 2021-01-18 12:04:47 +01:00
Miroslav Stampar
6244850749 More DREI stuff 2021-01-15 10:51:49 +01:00
Miroslav Stampar
d78590213b Brrrrr incompatibilities with every new Python minor revision 2021-01-15 09:31:57 +01:00
Miroslav Stampar
4490d55482 Removing leftover 2021-01-15 09:18:21 +01:00
Miroslav Stampar
fd137b49ef Fixing Python3.10 incompatibility 2021-01-15 09:17:33 +01:00
Miroslav Stampar
6fa5922fbd Bug fix (error heuristics not working in heavy dynamicity cases) 2021-01-14 22:49:08 +01:00
Miroslav Stampar
42884d3f09 Problems with badge.fury.io 2021-01-13 17:32:57 +01:00
Miroslav Stampar
1a0c533626 Fixes #4541 2021-01-13 13:17:46 +01:00
Miroslav Stampar
5d3bd6ea7a Adding support for YugabyteDB 2021-01-13 11:47:10 +01:00
Miroslav Stampar
29a7646334 Trivial update 2021-01-12 16:55:24 +01:00
shelld3v
fa93f5e099 New translation: Vietnamese (#4509)
* Create README-vi-VN.md

* Update README.md

* Consistency update (same style as in other translations)

Co-authored-by: Miroslav Stampar <miroslav@sqlmap.org>
2021-01-12 16:34:17 +01:00
Miroslav Stampar
12238019dd Patch for Python2.6 2021-01-12 16:28:50 +01:00
Miroslav Stampar
0b1b64b682 Thank you Travis CI in discovering of a cluster of f*cks 2021-01-12 16:21:43 +01:00
Miroslav Stampar
c8dc375fb5 Update for #4537 2021-01-12 15:58:40 +01:00
Miroslav Stampar
a697e6c307 All of a sudden PY2 _configparser doesn't support \tkey = value 2021-01-12 15:57:12 +01:00
Miroslav Stampar
66a3118f81 Adding support for JSON aggregation on SQLite 2021-01-12 15:36:02 +01:00
Miroslav Stampar
3002f92e34 Trivial update 2021-01-12 13:23:08 +01:00
Miroslav Stampar
2ef07c80db Some more refactoring 2021-01-12 13:21:51 +01:00
Miroslav Stampar
e3028f195e Support for Raima Database Manager DBMS 2021-01-11 17:36:23 +01:00
Miroslav Stampar
1f39dbd06d Another patch regarding #4530 2021-01-07 14:20:03 +01:00
Miroslav Stampar
ccf9e7de54 Another patch regarding #4530 2021-01-07 14:00:10 +01:00
Miroslav Stampar
ebd2a940cb Patching profile capabilities 2021-01-07 13:52:38 +01:00
Miroslav Stampar
0d3889730d Another patch for #4530 2021-01-07 11:56:49 +01:00
Miroslav Stampar
ccbc3e62f8 First patch for #4530 2021-01-07 11:44:00 +01:00
Miroslav Stampar
f84ec1072b Patch related to #4527 (drei) 2021-01-06 16:09:40 +01:00
Miroslav Stampar
779b352f6b Minor cosmetics 2021-01-06 15:47:50 +01:00
Miroslav Stampar
9af2e68b7e Update for #4525 2021-01-06 15:39:51 +01:00
Miroslav Stampar
bd59dd4a0f Trivial update 2021-01-06 15:21:33 +01:00
Miroslav Stampar
c4e6c3e854 Fixes #4513 2021-01-05 14:50:54 +01:00
Miroslav Stampar
91045aab60 Fixes #4510 2021-01-05 13:36:04 +01:00
Miroslav Stampar
b36d8248a4 More fine-tuning for #4505 (in case of --no-escape) 2021-01-04 13:51:51 +01:00
Miroslav Stampar
091678b9d4 Some fine tuning (#4505 - in case of --no-escape) 2021-01-04 13:45:38 +01:00
Miroslav Stampar
0c3d8c9bd1 Fixes #4505 2021-01-04 13:25:29 +01:00
Miroslav Stampar
f5b6b0eb4b Fixes #4504 2021-01-03 16:56:35 +01:00
Miroslav Stampar
e8048a3cf0 First 2021 dev commit 2021-01-03 15:28:40 +01:00
Miroslav Stampar
0207ecf0ee Version bump (1.5) 2021-01-03 15:23:40 +01:00
Miroslav Stampar
ae6a812ee1 Trivial updates 2020-12-31 12:38:57 +01:00
Miroslav Stampar
f23c04131c Patch of a patch 2020-12-31 12:17:08 +01:00
Miroslav Stampar
ab0df2a85c Fixes #4503 2020-12-31 12:09:15 +01:00
Miroslav Stampar
2cf2dd9a2c Fixes #4502 2020-12-31 12:00:13 +01:00
Miroslav Stampar
82e28e038e Another year bump 2020-12-31 11:49:19 +01:00
Miroslav Stampar
31fe3453a2 Copyright year bump 2020-12-31 11:46:27 +01:00
Miroslav Stampar
32deef59c3 Fixes #4499 2020-12-28 19:09:31 +01:00
Miroslav Stampar
8142dd8f3b Minor update 2020-12-28 15:39:01 +01:00
Miroslav Stampar
1b2ac3069d Implementing --proxy-freq (Issue #4496) 2020-12-26 23:04:48 +01:00
Miroslav Stampar
bb02eefb70 Fixes #4495 2020-12-26 00:49:42 +01:00
Miroslav Stampar
8c8aae9170 Fixes #4492 2020-12-25 23:24:59 +01:00
Miroslav Stampar
99e6d56f09 Fixes #4494 2020-12-25 22:55:19 +01:00
Miroslav Stampar
41e247be56 Another trivial update 2020-12-22 21:40:15 +01:00
Miroslav Stampar
81602c4093 Another minor update 2020-12-22 21:35:02 +01:00
Miroslav Stampar
31c597f9e6 Minor update 2020-12-22 21:30:12 +01:00
Miroslav Stampar
b039c35f2b Fixes #4479 2020-12-18 12:38:15 +01:00
Miroslav Stampar
bae7766e64 Support patch for #4486 2020-12-18 12:13:07 +01:00
Miroslav Stampar
9c95445723 Trivial update (drei nagging) 2020-12-18 12:01:49 +01:00
Miroslav Stampar
eeffcfe1b6 Periodic recloaking (AV) 2020-12-18 11:57:13 +01:00
Miroslav Stampar
809538d1bb Trivial update 2020-12-18 11:38:54 +01:00
Miroslav Stampar
5f743ab19b Fixes #4480 2020-12-17 13:50:33 +01:00
Miroslav Stampar
85c6d0d5c1 Fixes #4483 2020-12-17 13:34:23 +01:00
Miroslav Stampar
d9e6e678e8 Fixes #4470 2020-12-10 23:05:19 +01:00
Miroslav Stampar
7e675fed9f Fixes #4471 2020-12-10 22:47:29 +01:00
Miroslav Stampar
5bf52c3f9c Trivial patches 2020-12-10 14:22:44 +01:00
Miroslav Stampar
94709c93bb Minor update 2020-12-10 13:56:25 +01:00
Miroslav Stampar
a852d25314 Trying smth 2020-12-10 11:27:37 +01:00
Miroslav Stampar
c0aa8565a1 Update of banner regexes 2020-12-08 14:41:19 +01:00
Miroslav Stampar
bce1cfe00f Minor update 2020-12-08 13:40:46 +01:00
Miroslav Stampar
0cd6285707 Long live the Python2 2020-12-07 21:30:18 +01:00
Miroslav Stampar
8a783702d9 Fixes #4464 2020-12-07 12:28:49 +01:00
Miroslav Stampar
760563dbd1 Patch for #4451 2020-12-07 12:00:10 +01:00
Miroslav Stampar
92054b5d63 Fixes #4465,#4466,#4468,#4469 2020-12-07 11:42:46 +01:00
Miroslav Stampar
2f3801b808 Minor leftover 2020-12-07 11:23:11 +01:00
Miroslav Stampar
d5c9bdf279 Patch for #4467 2020-12-07 11:22:34 +01:00
Miroslav Stampar
12158af6ca Fixes #4457 2020-12-04 12:28:13 +01:00
tomjshore
8e662a5179 Changed get logs to hanndle ints correctly (#4460) 2020-12-04 11:47:09 +01:00
Miroslav Stampar
8d9c84236d Fixes #4458 2020-12-04 11:45:40 +01:00
Miroslav Stampar
815d417a9e Fixes #4462 2020-12-04 11:40:09 +01:00
Miroslav Stampar
3936a11280 Fixes #4450 2020-12-02 22:30:01 +01:00
Miroslav Stampar
13e363155a Fixes #4453 2020-12-02 21:43:11 +01:00
Miroslav Stampar
be0f7a9e07 Update of --beep (including XSS/FI) 2020-12-01 23:10:53 +01:00
Miroslav Stampar
33a8db9596 Minor patch 2020-12-01 22:56:24 +01:00
Miroslav Stampar
9f6eacb4e8 Fixes #4444 2020-12-01 16:36:34 +01:00
Miroslav Stampar
e6d9dc46ab Patch for #4449 2020-12-01 15:56:47 +01:00
Miroslav Stampar
c3e81a6223 Switching EXTRACTVALUE and FLOOR in priority (FLOOR is not working on recent MySQL) 2020-12-01 15:34:49 +01:00
Miroslav Stampar
78ba33737e Patch for known NCHAR/UNION-query SQLi problems 2020-12-01 12:16:15 +01:00
Miroslav Stampar
c6557e2b45 Minor patches 2020-11-30 23:33:08 +01:00
Miroslav Stampar
fa17cfb606 Fixes #4447 2020-11-30 22:25:56 +01:00
Miroslav Stampar
40623e780a Minor patch (--update to work with #pip) 2020-11-27 12:57:16 +01:00
Miroslav Stampar
35862bf4c8 Minor patch 2020-11-27 12:37:56 +01:00
Miroslav Stampar
5d6def425a Trivial cleanup 2020-11-27 12:32:05 +01:00
Miroslav Stampar
7066e7ce97 Trivial update 2020-11-26 23:41:35 +01:00
Miroslav Stampar
8dad7dd12d Trivial update 2020-11-24 14:07:30 +01:00
Miroslav Stampar
6b7c3a2f81 Minor cosmetics 2020-11-20 13:03:15 +01:00
Miroslav Stampar
e9b3af6b9a Minor compatibility patch for 'Copy as cURL' browser feature 2020-11-20 12:52:02 +01:00
Miroslav Stampar
194c911433 Another update for #4367 2020-11-16 11:59:17 +01:00
Miroslav Stampar
e621d7ec6a Fixes #4423 2020-11-16 10:28:53 +01:00
Miroslav Stampar
854507bc85 Potential fix for #4307 2020-11-13 23:00:26 +01:00
Miroslav Stampar
82eec780a2 Update README.md 2020-11-10 22:36:02 +01:00
Miroslav Stampar
de55be3afe Update README.md 2020-11-10 22:10:03 +01:00
Miroslav Stampar
4d2b890a0a Silent bug fix 2020-11-09 23:02:48 +01:00
Miroslav Stampar
c243c5fe0d Implementing --skip-heuristics (#4414) 2020-11-09 22:11:11 +01:00
Miroslav Stampar
a35fc713a2 Minor patch (AS keyword does not play well in nullCastConcatFields) 2020-11-05 11:20:51 +01:00
Miroslav Stampar
97b7dc585c Patch for #4419 2020-11-05 10:59:36 +01:00
Miroslav Stampar
c5a5717add Minor adjustment 2020-11-05 10:12:54 +01:00
Miroslav Stampar
fe4e79511a Fixes #4413 2020-11-02 11:15:45 +01:00
Miroslav Stampar
1d5bde9cdf Implementing --live-cookies (Issue #4401) 2020-10-29 13:51:11 +01:00
Miroslav Stampar
227a23f091 Fixes #4408 2020-10-29 12:33:12 +01:00
Miroslav Stampar
0ff3b1ce70 Implemented FOR JSON AUTO in MsSQL 2020-10-28 16:48:11 +01:00
Miroslav Stampar
7e483ffd7a Adding minor note 2020-10-28 14:38:13 +01:00
Miroslav Stampar
a5852390f7 Implements ARRAY_AGG for PostgreSQL 2020-10-28 14:36:25 +01:00
Miroslav Stampar
73d0c67a80 Implements #4407 2020-10-28 12:57:25 +01:00
Miroslav Stampar
8e9f7e90c3 Fixes #4404 2020-10-27 15:12:42 +01:00
Miroslav Stampar
f6bf331b8f Minor cosmetics 2020-10-27 14:57:12 +01:00
Miroslav Stampar
585645e806 Implements #4403 2020-10-27 14:06:56 +01:00
Miroslav Stampar
673a5afe07 Fixes #4400 2020-10-26 11:21:29 +01:00
Miroslav Stampar
c9a8b915c8 Fixes #4398 2020-10-25 17:34:06 +01:00
Miroslav Stampar
9645aaa33f Fixes #4399 2020-10-25 17:11:22 +01:00
Miroslav Stampar
e556876fe6 Fixes #4394 2020-10-21 14:58:30 +02:00
Miroslav Stampar
0524670cf9 More generic update for #4199 2020-10-21 14:44:07 +02:00
Miroslav Stampar
96a2c91701 Patch regarding #4199 2020-10-21 14:40:11 +02:00
Miroslav Stampar
5029d67e4f Minor update regarding the #4388 2020-10-20 12:54:22 +02:00
Miroslav Stampar
5af64f5ae4 Minor update 2020-10-20 12:37:07 +02:00
Miroslav Stampar
bc981c517b New vuln-test case 2020-10-15 17:20:32 +02:00
Miroslav Stampar
87ad11dffb Fixes #4383 and #4384 2020-10-15 12:11:21 +02:00
Miroslav Stampar
3663fa936b Fixes #4382 2020-10-14 23:04:01 +02:00
Miroslav Stampar
4687383a44 Patch for multiple-Ctrl-C in multiple-target mode 2020-10-14 12:22:56 +02:00
Miroslav Stampar
62cfd47b83 Minor patch 2020-10-14 11:49:58 +02:00
Miroslav Stampar
2bf22df53a Implementing support for piped input of targets 2020-10-14 11:34:52 +02:00
Miroslav Stampar
0585a55ee0 Trivial refactoring for #4379 2020-10-13 11:05:13 +02:00
tree-chtsec
babe52eb10 HSQLDB write file support (#4379)
* Make asterisk work with --csrf-token option

* add --file-write support in HSQLDB

Co-authored-by: tree <chtpt@treedeMacBook-Pro.local>
2020-10-13 10:56:39 +02:00
Miroslav Stampar
231c3da057 Update for #4380 2020-10-13 10:32:09 +02:00
Miroslav Stampar
13a2ab3fa3 Minor update (drei) 2020-10-05 21:36:30 +02:00
Miroslav Stampar
21cc6e3c99 Potential patch for #4367 2020-10-05 12:45:15 +02:00
Miroslav Stampar
a2a73b88ea Fixes #4366 2020-10-05 12:12:06 +02:00
475 changed files with 2720 additions and 6310 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
custom: 'https://www.paypal.com/donate?hosted_button_id=A34GMDLKA2V7G'

View File

@@ -9,7 +9,7 @@ jobs:
dist: trusty dist: trusty
- python: 3.6 - python: 3.6
dist: trusty dist: trusty
- python: 3.9-dev - python: nightly
dist: bionic dist: bionic
git: git:
depth: 1 depth: 1

View File

@@ -1,7 +1,7 @@
COPYING -- Describes the terms under which sqlmap is distributed. A copy COPYING -- Describes the terms under which sqlmap is distributed. A copy
of the GNU General Public License (GPL) is appended to this file. of the GNU General Public License (GPL) is appended to this file.
sqlmap is (C) 2006-2020 Bernardo Damele Assumpcao Guimaraes, Miroslav Stampar. sqlmap is (C) 2006-2021 Bernardo Damele Assumpcao Guimaraes, Miroslav Stampar.
This program is free software; you may redistribute and/or modify it under This program is free software; you may redistribute and/or modify it under
the terms of the GNU General Public License as published by the Free the terms of the GNU General Public License as published by the Free

View File

@@ -1,11 +1,9 @@
# sqlmap ![](https://i.imgur.com/fe85aVR.png) # sqlmap ![](https://i.imgur.com/fe85aVR.png)
[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) [![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap)
sqlmap is an open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws and taking over of database servers. It comes with a powerful detection engine, many niche features for the ultimate penetration tester, and a broad range of switches including database fingerprinting, over data fetching from the database, accessing the underlying file system, and executing commands on the operating system via out-of-band connections. sqlmap is an open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws and taking over of database servers. It comes with a powerful detection engine, many niche features for the ultimate penetration tester, and a broad range of switches including database fingerprinting, over data fetching from the database, accessing the underlying file system, and executing commands on the operating system via out-of-band connections.
**The sqlmap project is currently searching for sponsor(s).**
Screenshots Screenshots
---- ----
@@ -16,7 +14,7 @@ You can visit the [collection of screenshots](https://github.com/sqlmapproject/s
Installation Installation
---- ----
You can download the latest tarball by clicking [here](https://github.com/sqlmapproject/sqlmap/tarball/master) or latest zipball by clicking [here](https://github.com/sqlmapproject/sqlmap/zipball/master). You can download the latest tarball by clicking [here](https://github.com/sqlmapproject/sqlmap/tarball/master) or latest zipball by clicking [here](https://github.com/sqlmapproject/sqlmap/zipball/master).
Preferably, you can download sqlmap by cloning the [Git](https://github.com/sqlmapproject/sqlmap) repository: Preferably, you can download sqlmap by cloning the [Git](https://github.com/sqlmapproject/sqlmap) repository:
@@ -68,6 +66,8 @@ Translations
* [Polish](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-pl-PL.md) * [Polish](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-pl-PL.md)
* [Portuguese](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-pt-BR.md) * [Portuguese](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-pt-BR.md)
* [Russian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-ru-RUS.md) * [Russian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-ru-RUS.md)
* [Serbian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-rs-RS.md)
* [Spanish](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-es-MX.md) * [Spanish](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-es-MX.md)
* [Turkish](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-tr-TR.md) * [Turkish](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-tr-TR.md)
* [Ukrainian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-uk-UA.md) * [Ukrainian](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-uk-UA.md)
* [Vietnamese](https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-vi-VN.md)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
id id
@@ -485,6 +485,8 @@ llave
chaveta chaveta
tono tono
cuna cuna
correo
contrasenia
# german # german
@@ -798,7 +800,9 @@ news
nick nick
number number
nummer nummer
passhash
pass_hash pass_hash
password_hash
passwordsalt passwordsalt
personal_key personal_key
phone phone
@@ -2726,3 +2730,4 @@ confidential
# Misc # Misc
u_pass u_pass
hashedPw

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# Reference: https://gist.github.com/sckalath/78ad449346171d29241a # Reference: https://gist.github.com/sckalath/78ad449346171d29241a
@@ -1797,3 +1797,5 @@
/app/app.js /app/app.js
/app/configure.js /app/configure.js
/app/config/config.json /app/config/config.json
/flag.txt
/readflag

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
[Banners] [Banners]

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
users users
@@ -1825,6 +1825,7 @@ jos_comprofiler_members
jos_joomblog_users jos_joomblog_users
jos_moschat_users jos_moschat_users
knews_lostpass knews_lostpass
korisnik
korisnici korisnici
kpro_adminlogs kpro_adminlogs
kpro_user kpro_user
@@ -2215,6 +2216,7 @@ admin_pwd
admin_pass admin_pass
adminpassword adminpassword
admin_password admin_password
admin_passwords
usrpass usrpass
usr_pass usr_pass
pass pass
@@ -3221,6 +3223,10 @@ nuke_gallery_pictures_newpicture
Books Books
grupo grupo
facturas facturas
aclaraciones
preguntas
personas
estadisticas
# site:cn # site:cn
@@ -3497,3 +3503,78 @@ utenti
wm_products wm_products
wp_payout_history wp_payout_history
zamowienia zamowienia
# https://deliciousbrains.com/tour-wordpress-database/
wp_blogmeta
wp_blogs
wp_blog_versions
wp_commentmeta
wp_comments
wp_links
wp_options
wp_postmeta
wp_posts
wp_registration_log
wp_signups
wp_site
wp_sitemeta
wp_termmeta
wp_term_relationships
wp_terms
wp_term_taxonomy
wp_usermeta
wp_users
# https://docs.joomla.org/Tables
assets
bannerclient
banner
bannertrack
categories
components
contact_details
content_frontpage
content_rating
content
core_acl_aro_groups
core_acl_aro_map
core_acl_aro_sections
core_acl_aro
core_acl_groups_aro_map
core_log_items
core_log_searches
extensions
groups
languages
menu
menu_types
messages_cfg
messages
migration_backlinks
modules_menu
modules
newsfeeds
plugins
poll_data
poll_date
poll_menu
polls
redirect_links
Schemas
sections
session
stats_agents
templates_menu
template_styles
update_categories
update_sites_extensions
update_sites
updates
usergroups
user_profiles
users
user_usergroup_map
viewlevels
weblinks

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# SQL-92 keywords (reference: http://developer.mimer.com/validator/sql-reserved-words.tml) # SQL-92 keywords (reference: http://developer.mimer.com/validator/sql-reserved-words.tml)

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# Opera # Opera
@@ -4183,3 +4183,92 @@ Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, lik
Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10
Mozilla/5.0 (X11; U; Linux x86_64; en-ca) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ Mozilla/5.0 (X11; U; Linux x86_64; en-ca) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+
Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+
# https://techblog.willshouse.com/2012/01/03/most-common-user-agents/ (Note: Updated December 28th 2020)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15
Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0
Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15
Mozilla/5.0 (X11; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:83.0) Gecko/20100101 Firefox/83.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:83.0) Gecko/20100101 Firefox/83.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.400
Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.55
Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.400
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:83.0) Gecko/20100101 Firefox/83.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Safari/605.1.15
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 OPR/72.0.3815.320
Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0
Mozilla/5.0 (X11; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0
Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:84.0) Gecko/20100101 Firefox/84.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Safari/605.1.15
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 OPR/73.0.3856.284

View File

@@ -34,7 +34,7 @@
<!-- Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832%28v=vs.85%29.aspx --> <!-- Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832%28v=vs.85%29.aspx -->
<regexp value="Windows.*\b10\.0"> <regexp value="Windows.*\b10\.0">
<info type="Windows" distrib="2016|10"/> <info type="Windows" distrib="2019|2016|10"/>
</regexp> </regexp>
<regexp value="Windows.*\b6\.3"> <regexp value="Windows.*\b6\.3">
@@ -151,7 +151,7 @@
<info type="Linux" distrib="Ubuntu"/> <info type="Linux" distrib="Ubuntu"/>
</regexp> </regexp>
<!-- Unices --> <!-- BSD -->
<regexp value="FreeBSD"> <regexp value="FreeBSD">
<info type="FreeBSD"/> <info type="FreeBSD"/>

View File

@@ -64,6 +64,10 @@
<info dbms_version="1" type="Linux" distrib="Debian" release="12" codename="bookworm"/> <info dbms_version="1" type="Linux" distrib="Debian" release="12" codename="bookworm"/>
</regexp> </regexp>
<regexp value="^([\d\.]+)[\-\_]Debian[\-\_][\d\.]+trixie">
<info dbms_version="1" type="Linux" distrib="Debian" release="13" codename="trixie"/>
</regexp>
<regexp value="^([\d\.]+)[\-\_]Debian[\-\_][\d\.]+(sid|unstable)"> <regexp value="^([\d\.]+)[\-\_]Debian[\-\_][\d\.]+(sid|unstable)">
<info dbms_version="1" type="Linux" distrib="Debian" codename="unstable"/> <info dbms_version="1" type="Linux" distrib="Debian" codename="unstable"/>
</regexp> </regexp>

View File

@@ -10,7 +10,7 @@
<!-- Microsoft IIS --> <!-- Microsoft IIS -->
<regexp value="Microsoft-IIS/(10\.0)"> <regexp value="Microsoft-IIS/(10\.0)">
<info technology="Microsoft IIS" tech_version="1" type="Windows" distrib="2016|10"/> <info technology="Microsoft IIS" tech_version="1" type="Windows" distrib="2019|2016|10"/>
</regexp> </regexp>
<regexp value="Microsoft-IIS/(8\.5)"> <regexp value="Microsoft-IIS/(8\.5)">
@@ -74,23 +74,27 @@
<!-- Apache: CentOS --> <!-- Apache: CentOS -->
<regexp value="Apache/2\.0\.46 \(CentOS\)"> <regexp value="Apache/2\.0\.46 \(CentOS\)">
<info type="Linux" distrib="CentOS" release="3.9"/> <info type="Linux" distrib="CentOS" release="3"/>
</regexp> </regexp>
<regexp value="Apache/2\.0\.52 \(CentOS\)"> <regexp value="Apache/2\.0\.52 \(CentOS\)">
<info type="Linux" distrib="CentOS" release="4.9"/> <info type="Linux" distrib="CentOS" release="4"/>
</regexp> </regexp>
<regexp value="Apache/2\.2\.3 \(CentOS\)"> <regexp value="Apache/2\.2\.3 \(CentOS\)">
<info type="Linux" distrib="CentOS" release="5.10"/> <info type="Linux" distrib="CentOS" release="5"/>
</regexp> </regexp>
<regexp value="Apache/2\.2\.15 \(CentOS\)"> <regexp value="Apache/2\.2\.15 \(CentOS\)">
<info type="Linux" distrib="CentOS" release="6.8"/> <info type="Linux" distrib="CentOS" release="6"/>
</regexp> </regexp>
<regexp value="Apache/2\.4\.6 \(CentOS\)"> <regexp value="Apache/2\.4\.6 \(CentOS\)">
<info type="Linux" distrib="CentOS" release="7-1708"/> <info type="Linux" distrib="CentOS" release="7"/>
</regexp>
<regexp value="Apache/2\.4\.37 \(CentOS\)">
<info type="Linux" distrib="CentOS" release="8"/>
</regexp> </regexp>
<!-- Apache: Debian --> <!-- Apache: Debian -->
@@ -131,36 +135,32 @@
<info type="Linux" distrib="Debian" release="3.1" codename="sarge"/> <info type="Linux" distrib="Debian" release="3.1" codename="sarge"/>
</regexp> </regexp>
<regexp value="Apache/1\.3\.34 \(Debian GNU\/Linux\)">
<info type="Linux" distrib="Debian" release="4.0" codename="etch"/>
</regexp>
<regexp value="Apache/2\.2\.3 \(Debian\)"> <regexp value="Apache/2\.2\.3 \(Debian\)">
<info type="Linux" distrib="Debian" release="4.0" codename="etch"/> <info type="Linux" distrib="Debian" release="4" codename="etch"/>
</regexp>
<regexp value="Apache/2\.2\.6 \(Debian\)">
<info type="Linux" distrib="Debian" release="4.0" codename="etch" updated="True"/>
</regexp> </regexp>
<regexp value="Apache/2\.2\.9 \(Debian\)"> <regexp value="Apache/2\.2\.9 \(Debian\)">
<info type="Linux" distrib="Debian" release="5.0" codename="lenny"/> <info type="Linux" distrib="Debian" release="5" codename="lenny"/>
</regexp> </regexp>
<regexp value="Apache/2\.2\.16 \(Debian\)"> <regexp value="Apache/2\.2\.16 \(Debian\)">
<info type="Linux" distrib="Debian" release="6.0" codename="squeeze"/> <info type="Linux" distrib="Debian" release="6" codename="squeeze"/>
</regexp> </regexp>
<regexp value="Apache/2\.2\.22 \(Debian\)"> <regexp value="Apache/2\.2\.22 \(Debian\)">
<info type="Linux" distrib="Debian" release="7.0" codename="wheezy"/> <info type="Linux" distrib="Debian" release="7" codename="wheezy"/>
</regexp> </regexp>
<regexp value="Apache/2\.4\.10 \(Debian\)"> <regexp value="Apache/2\.4\.10 \(Debian\)">
<info type="Linux" distrib="Debian" release="8.0" codename="jessie"/> <info type="Linux" distrib="Debian" release="8" codename="jessie"/>
</regexp> </regexp>
<regexp value="Apache/2\.4\.25 \(Debian\)"> <regexp value="Apache/2\.4\.25 \(Debian\)">
<info type="Linux" distrib="Debian" release="9.0" codename="stretch"/> <info type="Linux" distrib="Debian" release="9" codename="stretch"/>
</regexp>
<regexp value="Apache/2\.4\.38 \(Debian\)">
<info type="Linux" distrib="Debian" release="10" codename="buster"/>
</regexp> </regexp>
<!-- Apache: Fedora --> <!-- Apache: Fedora -->
@@ -293,6 +293,31 @@
<info type="Linux" distrib="Fedora" release="27"/> <info type="Linux" distrib="Fedora" release="27"/>
</regexp> </regexp>
<regexp value="Apache/2\.4\.33 \(Fedora\)">
<info type="Linux" distrib="Fedora" release="28"/>
</regexp>
<regexp value="Apache/2\.4\.34 \(Fedora\)">
<info type="Linux" distrib="Fedora" release="29"/>
</regexp>
<regexp value="Apache/2\.4\.39 \(Fedora\)">
<info type="Linux" distrib="Fedora" release="30"/>
</regexp>
<regexp value="Apache/2\.4\.41 \(Fedora\)">
<info type="Linux" distrib="Fedora" release="31"/>
</regexp>
<regexp value="Apache/2\.4\.43 \(Fedora\)">
<info type="Linux" distrib="Fedora" release="32"/>
</regexp>
<regexp value="Apache/2\.4\.46 \(Fedora\)">
<info type="Linux" distrib="Fedora" release="33"/>
</regexp>
<!-- Apache: FreeBSD --> <!-- Apache: FreeBSD -->
<regexp value="Apache/2\.0\.16 \(FreeBSD\)"> <regexp value="Apache/2\.0\.16 \(FreeBSD\)">
@@ -407,6 +432,14 @@
<info type="FreeBSD" release="11.1"/> <info type="FreeBSD" release="11.1"/>
</regexp> </regexp>
<regexp value="Apache/2\.4\.39 \(FreeBSD\)">
<info type="FreeBSD" release="11.3"/>
</regexp>
<regexp value="Apache/2\.4\.46 \(FreeBSD\)">
<info type="FreeBSD" release="12.2"/>
</regexp>
<!-- Apache: Mandrake / Mandriva --> <!-- Apache: Mandrake / Mandriva -->
<regexp value="Apache/1\.3\.6 \(Unix\)\s+\(Mandrake/Linux\)"> <regexp value="Apache/1\.3\.6 \(Unix\)\s+\(Mandrake/Linux\)">
@@ -587,6 +620,10 @@
<info type="Linux" distrib="Red Hat" release="Enterprise 7" codename="Maipo"/> <info type="Linux" distrib="Red Hat" release="Enterprise 7" codename="Maipo"/>
</regexp> </regexp>
<regexp value="Apache/2\.4\.37 \(Red Hat\)">
<info type="Linux" distrib="Red Hat" release="Enterprise 8" codename="Ootpa"/>
</regexp>
<!-- Apache: SuSE --> <!-- Apache: SuSE -->
<regexp value="Apache/1\.3\.6 \(Unix\) \(SuSE/Linux\)"> <regexp value="Apache/1\.3\.6 \(Unix\) \(SuSE/Linux\)">
@@ -714,6 +751,14 @@
<info type="Linux" distrib="SuSE" release="42.2|42.3"/> <info type="Linux" distrib="SuSE" release="42.2|42.3"/>
</regexp> </regexp>
<regexp value="Apache/2\.4\.33 \(Linux/SuSE\)">
<info type="Linux" distrib="SuSE" release="15"/>
</regexp>
<regexp value="Apache/2\.4\.43 \(Linux/SuSE\)">
<info type="Linux" distrib="SuSE" release="15.2"/>
</regexp>
<!-- Apache: Ubuntu --> <!-- Apache: Ubuntu -->
<regexp value="Apache/2\.0\.50 \(Ubuntu\)"> <regexp value="Apache/2\.0\.50 \(Ubuntu\)">
@@ -800,6 +845,22 @@
<info type="Linux" distrib="Ubuntu" release="17.10" codename="artful"/> <info type="Linux" distrib="Ubuntu" release="17.10" codename="artful"/>
</regexp> </regexp>
<regexp value="Apache/2\.4\.29 \(Ubuntu\)">
<info type="Linux" distrib="Ubuntu" release="18.04" codename="bionic"/>
</regexp>
<regexp value="Apache/2\.4\.34 \(Ubuntu\)">
<info type="Linux" distrib="Ubuntu" release="18.10" codename="cosmic"/>
</regexp>
<regexp value="Apache/2\.4\.38 \(Ubuntu\)">
<info type="Linux" distrib="Ubuntu" release="19.04" codename="disco"/>
</regexp>
<regexp value="Apache/2\.4\.41 \(Ubuntu\)">
<info type="Linux" distrib="Ubuntu" release="19.10|20.04" codename="eoan|focal"/>
</regexp>
<!-- Nginx --> <!-- Nginx -->
<regexp value="nginx$"> <regexp value="nginx$">

View File

@@ -19,6 +19,22 @@
<info technology="EasyEngine" tech_version="1"/> <info technology="EasyEngine" tech_version="1"/>
</regexp> </regexp>
<regexp value="Phusion Passenger ([\d\.]+)">
<info technology="Phusion Passenger" tech_version="1"/>
</regexp>
<regexp value="Craft CMS">
<info technology="Craft CMS"/>
</regexp>
<regexp value="Express">
<info technology="Express"/>
</regexp>
<regexp value="WP Engine">
<info technology="WP Engine"/>
</regexp>
<regexp value="PleskLin"> <regexp value="PleskLin">
<info technology="Plesk" type="Linux"/> <info technology="Plesk" type="Linux"/>
</regexp> </regexp>

View File

@@ -42,7 +42,7 @@
<error regexp="\bSQL Server[^&lt;&quot;]+Driver"/> <error regexp="\bSQL Server[^&lt;&quot;]+Driver"/>
<error regexp="Warning.*?\W(mssql|sqlsrv)_"/> <error regexp="Warning.*?\W(mssql|sqlsrv)_"/>
<error regexp="\bSQL Server[^&lt;&quot;]+[0-9a-fA-F]{8}"/> <error regexp="\bSQL Server[^&lt;&quot;]+[0-9a-fA-F]{8}"/>
<error regexp="System\.Data\.SqlClient\.SqlException"/> <error regexp="System\.Data\.SqlClient\.(SqlException|SqlConnection\.OnError)"/>
<error regexp="(?s)Exception.*?\bRoadhouse\.Cms\."/> <error regexp="(?s)Exception.*?\bRoadhouse\.Cms\."/>
<error regexp="Microsoft SQL Native Client error '[0-9a-fA-F]{8}"/> <error regexp="Microsoft SQL Native Client error '[0-9a-fA-F]{8}"/>
<error regexp="\[SQL Server\]"/> <error regexp="\[SQL Server\]"/>
@@ -55,6 +55,7 @@
<error regexp="com\.microsoft\.sqlserver\.jdbc"/> <error regexp="com\.microsoft\.sqlserver\.jdbc"/>
<error regexp="Pdo[./_\\](Mssql|SqlSrv)"/> <error regexp="Pdo[./_\\](Mssql|SqlSrv)"/>
<error regexp="SQL(Srv|Server)Exception"/> <error regexp="SQL(Srv|Server)Exception"/>
<error regexp="Unclosed quotation mark after the character string"/>
</dbms> </dbms>
<dbms value="Microsoft Access"> <dbms value="Microsoft Access">
@@ -217,4 +218,17 @@
<error regexp="encountered after end of query"/> <error regexp="encountered after end of query"/>
<error regexp="A comparison operator is required here"/> <error regexp="A comparison operator is required here"/>
</dbms> </dbms>
<dbms value="Raima Database Manager">
<error regexp="-10048: Syntax error"/>
<error regexp="rdmStmtPrepare\(.+?\) returned"/>
</dbms>
<dbms value="Virtuoso">
<error regexp="SQ074: Line \d+:"/>
<error regexp="SR185: Undefined procedure"/>
<error regexp="SQ200: No table "/>
<error regexp="Virtuoso S0002 Error"/>
<error regexp="\[(Virtuoso Driver|Virtuoso iODBC Driver)\]\[Virtuoso Server\]"/>
</dbms>
</root> </root>

View File

@@ -175,7 +175,7 @@
<test> <test>
<title>MySQL &gt;= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)</title> <title>MySQL &gt;= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)</title>
<stype>2</stype> <stype>2</stype>
<level>1</level> <level>2</level>
<risk>1</risk> <risk>1</risk>
<clause>1,2,3,8,9</clause> <clause>1,2,3,8,9</clause>
<where>1</where> <where>1</where>
@@ -199,7 +199,7 @@
<test> <test>
<title>MySQL &gt;= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)</title> <title>MySQL &gt;= 5.0 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)</title>
<stype>2</stype> <stype>2</stype>
<level>1</level> <level>2</level>
<risk>3</risk> <risk>3</risk>
<clause>1,2,3,8,9</clause> <clause>1,2,3,8,9</clause>
<!-- Despite this is an OR payload, keep where to 1 because otherwise it will not work when injecting in ORDER BY or GROUP BY --> <!-- Despite this is an OR payload, keep where to 1 because otherwise it will not work when injecting in ORDER BY or GROUP BY -->
@@ -224,7 +224,7 @@
<test> <test>
<title>MySQL &gt;= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)</title> <title>MySQL &gt;= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)</title>
<stype>2</stype> <stype>2</stype>
<level>2</level> <level>1</level>
<risk>1</risk> <risk>1</risk>
<clause>1,2,3,8,9</clause> <clause>1,2,3,8,9</clause>
<where>1</where> <where>1</where>
@@ -248,7 +248,7 @@
<test> <test>
<title>MySQL &gt;= 5.1 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)</title> <title>MySQL &gt;= 5.1 OR error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)</title>
<stype>2</stype> <stype>2</stype>
<level>2</level> <level>1</level>
<risk>3</risk> <risk>3</risk>
<clause>1,2,3,8,9</clause> <clause>1,2,3,8,9</clause>
<!-- Despite this is an OR payload, keep where to 1 because otherwise it will not work when injecting in ORDER BY or GROUP BY --> <!-- Despite this is an OR payload, keep where to 1 because otherwise it will not work when injecting in ORDER BY or GROUP BY -->
@@ -322,7 +322,7 @@
<test> <test>
<title>MySQL &gt;= 4.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)</title> <title>MySQL &gt;= 4.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)</title>
<stype>2</stype> <stype>2</stype>
<level>2</level> <level>3</level>
<risk>1</risk> <risk>1</risk>
<clause>1,2,3,8,9</clause> <clause>1,2,3,8,9</clause>
<where>1</where> <where>1</where>
@@ -347,7 +347,7 @@
<!-- It does not work against ORDER BY or GROUP BY clause --> <!-- It does not work against ORDER BY or GROUP BY clause -->
<title>MySQL &gt;= 4.1 OR error-based - WHERE or HAVING clause (FLOOR)</title> <title>MySQL &gt;= 4.1 OR error-based - WHERE or HAVING clause (FLOOR)</title>
<stype>2</stype> <stype>2</stype>
<level>2</level> <level>3</level>
<risk>3</risk> <risk>3</risk>
<clause>1,8,9</clause> <clause>1,8,9</clause>
<where>1</where> <where>1</where>
@@ -372,7 +372,7 @@
<test> <test>
<title>MySQL OR error-based - WHERE or HAVING clause (FLOOR)</title> <title>MySQL OR error-based - WHERE or HAVING clause (FLOOR)</title>
<stype>2</stype> <stype>2</stype>
<level>3</level> <level>4</level>
<risk>3</risk> <risk>3</risk>
<clause>1,8,9</clause> <clause>1,8,9</clause>
<where>2</where> <where>2</where>
@@ -969,7 +969,7 @@
<test> <test>
<title>MySQL &gt;= 5.0 error-based - Parameter replace (FLOOR)</title> <title>MySQL &gt;= 5.0 error-based - Parameter replace (FLOOR)</title>
<stype>2</stype> <stype>2</stype>
<level>1</level> <level>2</level>
<risk>1</risk> <risk>1</risk>
<clause>1,2,3,9</clause> <clause>1,2,3,9</clause>
<where>3</where> <where>3</where>
@@ -1017,7 +1017,7 @@
<test> <test>
<title>MySQL &gt;= 5.1 error-based - Parameter replace (EXTRACTVALUE)</title> <title>MySQL &gt;= 5.1 error-based - Parameter replace (EXTRACTVALUE)</title>
<stype>2</stype> <stype>2</stype>
<level>3</level> <level>2</level>
<risk>1</risk> <risk>1</risk>
<clause>1,2,3,9</clause> <clause>1,2,3,9</clause>
<where>3</where> <where>3</where>
@@ -1258,7 +1258,7 @@
<test> <test>
<title>MySQL &gt;= 5.0 error-based - ORDER BY, GROUP BY clause (FLOOR)</title> <title>MySQL &gt;= 5.0 error-based - ORDER BY, GROUP BY clause (FLOOR)</title>
<stype>2</stype> <stype>2</stype>
<level>3</level> <level>4</level>
<risk>1</risk> <risk>1</risk>
<clause>2,3</clause> <clause>2,3</clause>
<where>1</where> <where>1</where>
@@ -1278,7 +1278,7 @@
<test> <test>
<title>MySQL &gt;= 5.1 error-based - ORDER BY, GROUP BY clause (EXTRACTVALUE)</title> <title>MySQL &gt;= 5.1 error-based - ORDER BY, GROUP BY clause (EXTRACTVALUE)</title>
<stype>2</stype> <stype>2</stype>
<level>4</level> <level>3</level>
<risk>1</risk> <risk>1</risk>
<clause>2,3</clause> <clause>2,3</clause>
<where>1</where> <where>1</where>
@@ -1318,7 +1318,7 @@
<test> <test>
<title>MySQL &gt;= 4.1 error-based - ORDER BY, GROUP BY clause (FLOOR)</title> <title>MySQL &gt;= 4.1 error-based - ORDER BY, GROUP BY clause (FLOOR)</title>
<stype>2</stype> <stype>2</stype>
<level>2</level> <level>3</level>
<risk>1</risk> <risk>1</risk>
<clause>2,3</clause> <clause>2,3</clause>
<where>1</where> <where>1</where>

View File

@@ -131,8 +131,8 @@
<blind query="SELECT tablename FROM pg_tables WHERE schemaname='%s' ORDER BY tablename OFFSET %d LIMIT 1" count="SELECT COUNT(tablename) FROM pg_tables WHERE schemaname='%s'"/> <blind query="SELECT tablename FROM pg_tables WHERE schemaname='%s' ORDER BY tablename OFFSET %d LIMIT 1" count="SELECT COUNT(tablename) FROM pg_tables WHERE schemaname='%s'"/>
</tables> </tables>
<columns> <columns>
<inband query="SELECT attname,typname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND a.relname='%s' AND nspname='%s' ORDER BY attname" condition="attname"/> <inband query="SELECT attname,typname FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND a.relname='%s' AND nspname='%s' ORDER BY attname" condition="attname"/>
<blind query="SELECT attname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND a.relname='%s' AND nspname='%s' ORDER BY attname" query2="SELECT typname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relname='%s' AND a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND attname='%s' AND nspname='%s' ORDER BY attname" count="SELECT COUNT(attname) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND a.relname='%s' AND nspname='%s'" condition="attname"/> <blind query="SELECT attname FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND a.relname='%s' AND nspname='%s' ORDER BY attname" query2="SELECT typname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relname='%s' AND a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND attname='%s' AND nspname='%s' ORDER BY attname" count="SELECT COUNT(attname) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND a.relname='%s' AND nspname='%s'" condition="attname"/>
</columns> </columns>
<dump_table> <dump_table>
<inband query="SELECT %s FROM %s.%s ORDER BY %s"/> <inband query="SELECT %s FROM %s.%s ORDER BY %s"/>
@@ -147,8 +147,8 @@
<blind query="SELECT DISTINCT(schemaname) FROM pg_tables WHERE %s" query2="SELECT tablename FROM pg_tables WHERE schemaname='%s'" count="SELECT COUNT(DISTINCT(schemaname)) FROM pg_tables WHERE %s" count2="SELECT COUNT(tablename) FROM pg_tables WHERE schemaname='%s'" condition="tablename" condition2="schemaname"/> <blind query="SELECT DISTINCT(schemaname) FROM pg_tables WHERE %s" query2="SELECT tablename FROM pg_tables WHERE schemaname='%s'" count="SELECT COUNT(DISTINCT(schemaname)) FROM pg_tables WHERE %s" count2="SELECT COUNT(tablename) FROM pg_tables WHERE schemaname='%s'" condition="tablename" condition2="schemaname"/>
</search_table> </search_table>
<search_column> <search_column>
<inband query="SELECT nspname,relname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND %s" condition="attname" condition2="nspname" condition3="relname"/> <inband query="SELECT nspname,relname FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND %s" condition="attname" condition2="nspname" condition3="relname"/>
<blind query="SELECT DISTINCT(nspname) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND %s" query2="SELECT DISTINCT(relname) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND nspname='%s'" count="SELECT COUNT(DISTINCT(nspname)) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND %s" count2="SELECT COUNT(DISTINCT(relname)) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND nspname='%s'" condition="attname" condition2="nspname" condition3="relname"/> <blind query="SELECT DISTINCT(nspname) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND %s" query2="SELECT DISTINCT(relname) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND nspname='%s'" count="SELECT COUNT(DISTINCT(nspname)) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND %s" count2="SELECT COUNT(DISTINCT(relname)) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND nspname='%s'" condition="attname" condition2="nspname" condition3="relname"/>
</search_column> </search_column>
</dbms> </dbms>
@@ -198,11 +198,11 @@
<blind query="SELECT TOP 1 name FROM master..sysdatabases WHERE name NOT IN (SELECT TOP %d name FROM master..sysdatabases ORDER BY name) ORDER BY name" count="SELECT LTRIM(STR(COUNT(name))) FROM master..sysdatabases"/> <blind query="SELECT TOP 1 name FROM master..sysdatabases WHERE name NOT IN (SELECT TOP %d name FROM master..sysdatabases ORDER BY name) ORDER BY name" count="SELECT LTRIM(STR(COUNT(name))) FROM master..sysdatabases"/>
</dbs> </dbs>
<tables> <tables>
<inband query="SELECT %s..sysusers.name+'.'+%s..sysobjects.name FROM %s..sysobjects INNER JOIN %s..sysusers ON %s..sysobjects.uid=%s..sysusers.uid WHERE %s..sysobjects.xtype IN ('u','v')" query2="SELECT table_schema+'.'+table_name FROM information_schema.tables WHERE table_catalog='%s'" query3="SELECT name FROM %s..sysobjects WHERE xtype='U'"/> <inband query="SELECT %s..sysusers.name+'.'+%s..sysobjects.name AS table_name FROM %s..sysobjects INNER JOIN %s..sysusers ON %s..sysobjects.uid=%s..sysusers.uid WHERE %s..sysobjects.xtype IN ('u','v')" query2="SELECT table_schema+'.'+table_name FROM information_schema.tables WHERE table_catalog='%s'" query3="SELECT name FROM %s..sysobjects WHERE xtype='U'"/>
<blind query="SELECT TOP 1 %s..sysusers.name+'.'+%s..sysobjects.name FROM %s..sysobjects INNER JOIN %s..sysusers ON %s..sysobjects.uid=%s..sysusers.uid WHERE %s..sysobjects.xtype IN ('u','v') AND %s..sysusers.name+'.'+%s..sysobjects.name NOT IN (SELECT TOP %d %s..sysusers.name+'.'+%s..sysobjects.name FROM %s..sysobjects INNER JOIN %s..sysusers ON %s..sysobjects.uid=%s..sysusers.uid WHERE %s..sysobjects.xtype IN ('u','v') ORDER BY %s..sysusers.name+'.'+%s..sysobjects.name) ORDER BY %s..sysusers.name+'.'+%s..sysobjects.name" count="SELECT LTRIM(STR(COUNT(name))) FROM %s..sysobjects WHERE %s..sysobjects.xtype IN ('u','v')" query2="SELECT TOP 1 table_schema+'.'+table_name FROM information_schema.tables WHERE table_catalog='%s' AND table_schema+'.'+table_name NOT IN (SELECT TOP %d table_schema+'.'+table_name FROM information_schema.tables WHERE table_catalog='%s' ORDER BY table_schema+'.'+table_name) ORDER BY table_schema+'.'+table_name" count2="SELECT LTRIM(STR(COUNT(table_name))) FROM information_schema.tables WHERE table_catalog='%s'" query3="SELECT TOP 1 name FROM %s..sysobjects WHERE xtype='U' AND name NOT IN (SELECT TOP %d name FROM %s..sysobjects WHERE xtype='U' ORDER BY name) ORDER BY name" count3="SELECT COUNT(name) FROM %s..sysobjects WHERE xtype='U'"/> <blind query="SELECT TOP 1 %s..sysusers.name+'.'+%s..sysobjects.name FROM %s..sysobjects INNER JOIN %s..sysusers ON %s..sysobjects.uid=%s..sysusers.uid WHERE %s..sysobjects.xtype IN ('u','v') AND %s..sysusers.name+'.'+%s..sysobjects.name NOT IN (SELECT TOP %d %s..sysusers.name+'.'+%s..sysobjects.name FROM %s..sysobjects INNER JOIN %s..sysusers ON %s..sysobjects.uid=%s..sysusers.uid WHERE %s..sysobjects.xtype IN ('u','v') ORDER BY %s..sysusers.name+'.'+%s..sysobjects.name) ORDER BY %s..sysusers.name+'.'+%s..sysobjects.name" count="SELECT LTRIM(STR(COUNT(name))) FROM %s..sysobjects WHERE %s..sysobjects.xtype IN ('u','v')" query2="SELECT TOP 1 table_schema+'.'+table_name FROM information_schema.tables WHERE table_catalog='%s' AND table_schema+'.'+table_name NOT IN (SELECT TOP %d table_schema+'.'+table_name FROM information_schema.tables WHERE table_catalog='%s' ORDER BY table_schema+'.'+table_name) ORDER BY table_schema+'.'+table_name" count2="SELECT LTRIM(STR(COUNT(table_name))) FROM information_schema.tables WHERE table_catalog='%s'" query3="SELECT TOP 1 name FROM %s..sysobjects WHERE xtype='U' AND name NOT IN (SELECT TOP %d name FROM %s..sysobjects WHERE xtype='U' ORDER BY name) ORDER BY name" count3="SELECT COUNT(name) FROM %s..sysobjects WHERE xtype='U'"/>
</tables> </tables>
<columns> <columns>
<inband query="SELECT %s..syscolumns.name,TYPE_NAME(%s..syscolumns.xtype) FROM %s..syscolumns,%s..sysobjects WHERE %s..syscolumns.id=%s..sysobjects.id AND %s..sysobjects.name='%s'" query2="SELECT COL_NAME(OBJECT_ID('%s.%s'),%d)" condition="[DB]..syscolumns.name"/> <inband query="SELECT %s..syscolumns.name,TYPE_NAME(%s..syscolumns.xtype) AS type_name FROM %s..syscolumns,%s..sysobjects WHERE %s..syscolumns.id=%s..sysobjects.id AND %s..sysobjects.name='%s'" query2="SELECT COL_NAME(OBJECT_ID('%s.%s'),%d)" condition="[DB]..syscolumns.name"/>
<blind query="SELECT TOP 1 %s..syscolumns.name FROM %s..syscolumns,%s..sysobjects WHERE %s..syscolumns.id=%s..sysobjects.id AND %s..sysobjects.name='%s' AND %s..syscolumns.name NOT IN (SELECT TOP %d %s..syscolumns.name FROM %s..syscolumns,%s..sysobjects WHERE %s..syscolumns.id=%s..sysobjects.id AND %s..sysobjects.name='%s' ORDER BY %s..syscolumns.name) ORDER BY %s..syscolumns.name" query2="SELECT TYPE_NAME(%s..syscolumns.xtype) FROM %s..syscolumns,%s..sysobjects WHERE %s..syscolumns.name='%s' AND %s..syscolumns.id=%s..sysobjects.id AND %s..sysobjects.name='%s'" query3="SELECT COL_NAME(OBJECT_ID('%s.%s'),%d)" count="SELECT LTRIM(STR(COUNT(name))) FROM %s..syscolumns WHERE id=(SELECT id FROM %s..sysobjects WHERE name='%s')" condition="[DB]..syscolumns.name"/> <blind query="SELECT TOP 1 %s..syscolumns.name FROM %s..syscolumns,%s..sysobjects WHERE %s..syscolumns.id=%s..sysobjects.id AND %s..sysobjects.name='%s' AND %s..syscolumns.name NOT IN (SELECT TOP %d %s..syscolumns.name FROM %s..syscolumns,%s..sysobjects WHERE %s..syscolumns.id=%s..sysobjects.id AND %s..sysobjects.name='%s' ORDER BY %s..syscolumns.name) ORDER BY %s..syscolumns.name" query2="SELECT TYPE_NAME(%s..syscolumns.xtype) FROM %s..syscolumns,%s..sysobjects WHERE %s..syscolumns.name='%s' AND %s..syscolumns.id=%s..sysobjects.id AND %s..sysobjects.name='%s'" query3="SELECT COL_NAME(OBJECT_ID('%s.%s'),%d)" count="SELECT LTRIM(STR(COUNT(name))) FROM %s..syscolumns WHERE id=(SELECT id FROM %s..sysobjects WHERE name='%s')" condition="[DB]..syscolumns.name"/>
</columns> </columns>
<dump_table> <dump_table>
@@ -357,7 +357,7 @@
<blind query="SELECT tbl_name FROM sqlite_master WHERE type='table' LIMIT %d,1" count="SELECT COUNT(tbl_name) FROM sqlite_master WHERE type='table'"/> <blind query="SELECT tbl_name FROM sqlite_master WHERE type='table' LIMIT %d,1" count="SELECT COUNT(tbl_name) FROM sqlite_master WHERE type='table'"/>
</tables> </tables>
<columns> <columns>
<inband query="SELECT MIN(sql) FROM sqlite_master WHERE tbl_name='%s'"/> <inband query="SELECT MAX(sql) FROM sqlite_master WHERE tbl_name='%s'"/>
<blind query="SELECT sql FROM sqlite_master WHERE tbl_name='%s' LIMIT 1" condition=""/> <blind query="SELECT sql FROM sqlite_master WHERE tbl_name='%s' LIMIT 1" condition=""/>
</columns> </columns>
<dump_table> <dump_table>
@@ -1370,8 +1370,8 @@
<blind query="SELECT table_name FROM information_schema.tables WHERE table_schema='%s' LIMIT 1 OFFSET %d" count="SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema='%s'"/> <blind query="SELECT table_name FROM information_schema.tables WHERE table_schema='%s' LIMIT 1 OFFSET %d" count="SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema='%s'"/>
</tables> </tables>
<columns> <columns>
<inband query="SELECT attname,typname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND a.relname='%s' AND nspname='%s'" condition="attname"/> <inband query="SELECT attname,typname FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND a.relname='%s' AND nspname='%s'" condition="attname"/>
<blind query="SELECT attname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND a.relname='%s' AND nspname='%s'" query2="SELECT typname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relname='%s' AND a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND attname='%s' AND nspname='%s'" count="SELECT COUNT(attname) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND a.relname='%s' AND nspname='%s'" condition="attname"/> <blind query="SELECT attname FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND a.relname='%s' AND nspname='%s'" query2="SELECT typname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relname='%s' AND a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND attname='%s' AND nspname='%s'" count="SELECT COUNT(attname) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND a.relname='%s' AND nspname='%s'" condition="attname"/>
</columns> </columns>
<dump_table> <dump_table>
<inband query="SELECT %s FROM %s.%s ORDER BY %s"/> <inband query="SELECT %s FROM %s.%s ORDER BY %s"/>
@@ -1386,8 +1386,8 @@
<blind query="SELECT DISTINCT(table_schema) FROM information_schema.tables WHERE %s" query2="SELECT table_name FROM information_schema.tables WHERE table_schema='%s'" count="SELECT COUNT(DISTINCT(table_schema)) FROM information_schema.tables WHERE %s" count2="SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema='%s'" condition="table_name" condition2="table_schema"/> <blind query="SELECT DISTINCT(table_schema) FROM information_schema.tables WHERE %s" query2="SELECT table_name FROM information_schema.tables WHERE table_schema='%s'" count="SELECT COUNT(DISTINCT(table_schema)) FROM information_schema.tables WHERE %s" count2="SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema='%s'" condition="table_name" condition2="table_schema"/>
</search_table> </search_table>
<search_column> <search_column>
<inband query="SELECT nspname,relname FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND %s" condition="attname" condition2="nspname" condition3="relname"/> <inband query="SELECT nspname,relname FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND %s" condition="attname" condition2="nspname" condition3="relname"/>
<blind query="SELECT DISTINCT(nspname) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND %s" query2="SELECT DISTINCT(relname) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND nspname='%s'" count="SELECT COUNT(DISTINCT(nspname)) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND %s" count2="SELECT COUNT(DISTINCT(relname)) FROM pg_namespace,pg_type,pg_attribute b JOIN pg_class a ON a.oid=b.attrelid WHERE a.relnamespace=pg_namespace.oid AND pg_type.oid=b.atttypid AND attnum>0 AND nspname='%s'" condition="attname" condition2="nspname" condition3="relname"/> <blind query="SELECT DISTINCT(nspname) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND %s" query2="SELECT DISTINCT(relname) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND nspname='%s'" count="SELECT COUNT(DISTINCT(nspname)) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND %s" count2="SELECT COUNT(DISTINCT(relname)) FROM pg_attribute b JOIN pg_class a ON a.oid=b.attrelid JOIN pg_type c ON c.oid=b.atttypid JOIN pg_namespace d ON a.relnamespace=d.oid WHERE b.attnum>0 AND nspname='%s'" condition="attname" condition2="nspname" condition3="relname"/>
</search_column> </search_column>
</dbms> </dbms>
@@ -1626,4 +1626,94 @@
<blind query="SELECT &quot;schema_name&quot; FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND %s" query2="SELECT &quot;table_name&quot; FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;schema_name&quot;='%s'" count="SELECT COUNT(&quot;schema_name&quot;) FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND %s" count2="SELECT COUNT(&quot;table_name&quot;) FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;schema_name&quot;='%s'" condition="&quot;column_name&quot;" condition2="&quot;schema_name&quot;" condition3="&quot;table_name&quot;"/> <blind query="SELECT &quot;schema_name&quot; FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND %s" query2="SELECT &quot;table_name&quot; FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;schema_name&quot;='%s'" count="SELECT COUNT(&quot;schema_name&quot;) FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND %s" count2="SELECT COUNT(&quot;table_name&quot;) FROM INFORMATION_SCHEMA.COLUMNS,INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.SCHEMATA WHERE INFORMATION_SCHEMA.COLUMNS.table_pk=INFORMATION_SCHEMA.TABLES.table_pk AND INFORMATION_SCHEMA.TABLES.schema_pk=INFORMATION_SCHEMA.SCHEMATA.schema_pk AND &quot;schema_name&quot;='%s'" condition="&quot;column_name&quot;" condition2="&quot;schema_name&quot;" condition3="&quot;table_name&quot;"/>
</search_column> </search_column>
</dbms> </dbms>
<dbms value="Raima Database Manager">
<cast query="CONVERT(%s,CHAR)"/>
<length query="LENGTH(%s)"/>
<isnull query="IFNULL(%s,' ')"/>
<delimiter query="||"/>
<limit/>
<limitregexp/>
<limitgroupstart/>
<limitgroupstop/>
<limitstring/>
<order query="ORDER BY %s ASC"/>
<count query="COUNT(%s)"/>
<comment query="/*"/>
<concatenate query="%s||%s"/>
<case query="SELECT (IF(%s,1,0))"/>
<inference query="UNICODE(SUBSTRING((%s),%d,1))>%d"/>
<banner/>
<current_user/>
<current_db/>
<hostname/>
<table_comment/>
<column_comment/>
<is_dba/>
<dbs/>
<tables/>
<dump_table>
<inband query="SELECT %s FROM %s"/>
<!-- NOTE: Raima does not like escaping of LIKE strings (e.g. ...LIKE CHAR(32)) -->
<blind query="SELECT MIN(%s) FROM %s WHERE CONVERT(%s,CHAR)>'%s'" query2="SELECT MAX(%s) FROM %s WHERE CONVERT(%s,CHAR) LIKE [SINGLE_QUOTE]%s[SINGLE_QUOTE]" count="SELECT COUNT(*) FROM %s" count2="SELECT COUNT(DISTINCT(%s)) FROM %s"/>
</dump_table>
<users/>
<privileges/>
<roles/>
<statements/>
<search_db/>
<search_table/>
<search_column/>
</dbms>
<dbms value="Virtuoso">
<cast query="CAST(%s AS NCHAR)"/>
<length query="LENGTH(%s)"/>
<isnull query="__MAX_NOTNULL(%s,' ')"/>
<delimiter query="||"/>
<limit query="TOP (%d,%d)"/>
<limitregexp query="\s+TOP\s*\(([\d]+)\s*\,\s*([\d]+)\)" query2="\s+TOP\s+([\d]+)"/>
<limitgroupstart query="1"/>
<limitgroupstop query="2"/>
<limitstring query=" TOP "/>
<order query="ORDER BY %s ASC"/>
<count query="COUNT(%s)"/>
<comment query="-- -" query2="/*"/>
<concatenate query="%s||%s"/>
<case query="SELECT (CASE WHEN (%s) THEN 1 ELSE 0 END)"/>
<inference query="ASCII(SUBSTRING((%s),%d,1))>%d"/>
<banner query="sys_stat('st_dbms_name')||' - '||sys_stat('st_dbms_ver')"/>
<current_user query="USERNAME()"/>
<current_db query="UPPER(USERNAME())"/>
<hostname query="sys_stat('st_host_name')"/>
<table_comment/>
<column_comment/>
<is_dba query="USERNAME()='dba'"/>
<dbs>
<inband query="SELECT schema_name FROM INFORMATION_SCHEMA.SCHEMATA"/>
<blind query="SELECT DISTINCT TOP (%d,1) schema_name FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY 1" count="SELECT COUNT(DISTINCT(schema_name)) FROM INFORMATION_SCHEMA.SCHEMATA"/>
</dbs>
<tables>
<inband query="SELECT table_schema,table_name FROM INFORMATION_SCHEMA.TABLES" condition="table_schema"/>
<blind query="SELECT TOP (%d,1) table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='%s' ORDER BY 1" count="SELECT COUNT(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='%s'"/>
</tables>
<columns>
<inband query="SELECT column_name,data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND table_schema='%s'" condition="column_name"/>
<blind query="SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND table_schema='%s'" query2="SELECT data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND column_name='%s' AND table_schema='%s'" count="SELECT COUNT(column_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='%s' AND table_schema='%s'" condition="column_name"/>
</columns>
<dump_table>
<inband query="SELECT %s FROM %s.%s ORDER BY %s"/>
<blind query="SELECT TOP (%d,1) %s FROM %s.%s ORDER BY %s" count="SELECT COUNT(*) FROM %s.%s"/>
</dump_table>
<users>
<inband query="SELECT u_name FROM SYS_USERS WHERE U_IS_ROLE=0 ORDER BY 1"/>
<blind query="SELECT TOP (%d,1) u_name FROM SYS_USERS WHERE U_IS_ROLE=0 ORDER BY 1" count="SELECT COUNT(DISTINCT(u_name)) FROM SYS_USERS"/>
</users>
<privileges/>
<roles/>
<statements/>
<search_db/>
<search_table/>
<search_column/>
</dbms>
</root> </root>

View File

@@ -151,11 +151,6 @@ Giorgio Fedon, <giorgio.fedon(at)gmail.com>
Kasper Fons, <thefeds(at)mail.dk> Kasper Fons, <thefeds(at)mail.dk>
* for reporting several bugs * for reporting several bugs
Jose Fonseca, <jose.r.fonseca(at)gmail.com>
* for his Gprof2Dot utility for converting profiler output to dot graph(s) and for his XDot utility to render nicely dot graph(s), both included in sqlmap tree inside extra folder. These libraries are used for sqlmap development purposes only
http://code.google.com/p/jrfonseca/wiki/Gprof2Dot
http://code.google.com/p/jrfonseca/wiki/XDot
Alan Franzoni, <alan.franzoni(at)gmail.com> Alan Franzoni, <alan.franzoni(at)gmail.com>
* for helping out with Python subprocess library * for helping out with Python subprocess library
@@ -739,6 +734,9 @@ rmillet, <rmillet42(at)gmail.com>
Rub3nCT, <rub3nct(at)gmail.com> Rub3nCT, <rub3nct(at)gmail.com>
* for reporting a minor bug * for reporting a minor bug
sapra, <amanistaken(at)gmail.com>
* for helping out with Python multiprocessing library on MacOS
shiftzwei, <shiftzwei(at)gmail.com> shiftzwei, <shiftzwei(at)gmail.com>
* for reporting a couple of bugs * for reporting a couple of bugs

View File

@@ -48,14 +48,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* The `Chardet` library located under `thirdparty/chardet/`. * The `Chardet` library located under `thirdparty/chardet/`.
Copyright (C) 2008, Mark Pilgrim. Copyright (C) 2008, Mark Pilgrim.
* The `Gprof2dot` library located under `thirdparty/gprof2dot/`.
Copyright (C) 2008-2009, Jose Fonseca.
* The `KeepAlive` library located under `thirdparty/keepalive/`. * The `KeepAlive` library located under `thirdparty/keepalive/`.
Copyright (C) 2002-2003, Michael D. Stenner. Copyright (C) 2002-2003, Michael D. Stenner.
* The `MultipartPost` library located under `thirdparty/multipart/`. * The `MultipartPost` library located under `thirdparty/multipart/`.
Copyright (C) 2006, Will Holcomb. Copyright (C) 2006, Will Holcomb.
* The `XDot` library located under `thirdparty/xdot/`
Copyright (C) 2008, Jose Fonseca.
* The `icmpsh` tool located under `extra/icmpsh/`. * The `icmpsh` tool located under `extra/icmpsh/`.
Copyright (C) 2010, Nico Leidecker, Bernardo Damele. Copyright (C) 2010, Nico Leidecker, Bernardo Damele.

View File

@@ -2,7 +2,7 @@
[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) [![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap)
sqlmap merupakan alat _(tool)_ bantu _open source_ dalam melakukan tes penetrasi yang mengotomasi proses deteksi dan eksploitasi kelemahan _SQL injection_ dan pengambil-alihan server basis data. sqlmap dilengkapi dengan pendeteksi canggih, fitur-fitur hanal bagi _penetration tester_, beragam cara untuk mendeteksi basis data, hingga mengakses _file system_ dan mengeksekusi perintah dalam sistem operasi melalui koneksi _out-of-band_. sqlmap merupakan alat _(tool)_ bantu _open source_ dalam melakukan tes penetrasi yang mengotomasi proses deteksi dan eksploitasi kelemahan _SQL injection_ dan pengambil-alihan server basis data. sqlmap dilengkapi dengan pendeteksi canggih, fitur-fitur handal bagi _penetration tester_, beragam cara untuk mendeteksi basis data, hingga mengakses _file system_ dan mengeksekusi perintah dalam sistem operasi melalui koneksi _out-of-band_.
Tangkapan Layar Tangkapan Layar
---- ----
@@ -14,8 +14,7 @@ Anda dapat mengunjungi [koleksi tangkapan layar](https://github.com/sqlmapprojec
Instalasi Instalasi
---- ----
Anda dapat mengunduh tarball versi terbaru [di sini] Anda dapat mengunduh tarball versi terbaru [di sini](https://github.com/sqlmapproject/sqlmap/tarball/master) atau zipball [di sini](https://github.com/sqlmapproject/sqlmap/zipball/master).
(https://github.com/sqlmapproject/sqlmap/tarball/master) atau zipball [di sini](https://github.com/sqlmapproject/sqlmap/zipball/master).
Sebagai alternatif, Anda dapat mengunduh sqlmap dengan men-_clone_ repositori [Git](https://github.com/sqlmapproject/sqlmap): Sebagai alternatif, Anda dapat mengunduh sqlmap dengan men-_clone_ repositori [Git](https://github.com/sqlmapproject/sqlmap):

View File

@@ -0,0 +1,50 @@
# sqlmap
[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap)
sqlmap je alat otvorenog koda namenjen za penetraciono testiranje koji automatizuje proces detekcije i eksploatacije sigurnosnih propusta SQL injekcije i preuzimanje baza podataka. Dolazi s moćnim mehanizmom za detekciju, mnoštvom korisnih opcija za napredno penetracijsko testiranje te široki spektar opcija od onih za prepoznavanja baze podataka, preko uzimanja podataka iz baze, do pristupa zahvaćenom fajl sistemu i izvršavanja komandi na operativnom sistemu korištenjem tzv. "out-of-band" veza.
Slike
----
![Slika](https://raw.github.com/wiki/sqlmapproject/sqlmap/images/sqlmap_screenshot.png)
Možete posetiti [kolekciju slika](https://github.com/sqlmapproject/sqlmap/wiki/Screenshots) gde su demonstrirane neke od e se demonstriraju neke od funkcija na wiki stranicama.
Instalacija
----
Možete preuzeti najnoviji tarball klikom [ovde](https://github.com/sqlmapproject/sqlmap/tarball/master) ili najnoviji zipball klikom [ovde](https://github.com/sqlmapproject/sqlmap/zipball/master).
Opciono, možete preuzeti sqlmap kloniranjem [Git](https://github.com/sqlmapproject/sqlmap) repozitorija:
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
sqlmap radi bez posebnih zahteva korištenjem [Python](http://www.python.org/download/) verzije **2.6**, **2.7** i/ili **3.x** na bilo kojoj platformi.
Korišćenje
----
Kako biste dobili listu osnovnih opcija i prekidača koristite:
python sqlmap.py -h
Kako biste dobili listu svih opcija i prekidača koristite:
python sqlmap.py -hh
Možete pronaći primer izvršavanja [ovde](https://asciinema.org/a/46601).
Kako biste dobili pregled mogućnosti sqlmap-a, liste podržanih funkcija, te opis svih opcija i prekidača, zajedno s primerima, preporučen je uvid u [korisnički priručnik](https://github.com/sqlmapproject/sqlmap/wiki/Usage).
Linkovi
----
* Početna stranica: http://sqlmap.org
* Preuzimanje: [.tar.gz](https://github.com/sqlmapproject/sqlmap/tarball/master) ili [.zip](https://github.com/sqlmapproject/sqlmap/zipball/master)
* RSS feed promena u kodu: https://github.com/sqlmapproject/sqlmap/commits/master.atom
* Prijava problema: https://github.com/sqlmapproject/sqlmap/issues
* Korisnički priručnik: https://github.com/sqlmapproject/sqlmap/wiki
* Najčešće postavljena pitanja (FAQ): https://github.com/sqlmapproject/sqlmap/wiki/FAQ
* Twitter: [@sqlmap](https://twitter.com/sqlmap)
* Demo: [http://www.youtube.com/user/inquisb/videos](http://www.youtube.com/user/inquisb/videos)
* Slike: https://github.com/sqlmapproject/sqlmap/wiki/Screenshots

View File

@@ -0,0 +1,52 @@
# sqlmap ![](https://i.imgur.com/fe85aVR.png)
[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap)
sqlmap là một công cụ kiểm tra thâm nhập mã nguồn mở, nhằm tự động hóa quá trình phát hiện, khai thác lỗ hổng tiêm SQL và tiếp quản các máy chủ cơ sở dữ liệu. Nó đi kèm với
một hệ thống phát hiện mạnh mẽ, nhiều tính năng thích hợp cho người kiểm tra thâm nhập (pentester) và một loạt các tùy chọn bao gồm phát hiện cơ sở dữ liệu, truy xuất dữ liệu từ cơ sở dữ liệu, truy cập tệp của hệ thống và thực hiện các lệnh trên hệ điều hành từ xa.
Ảnh chụp màn hình
----
![Screenshot](https://raw.github.com/wiki/sqlmapproject/sqlmap/images/sqlmap_screenshot.png)
Bạn có thể truy cập vào [bộ sưu tập ảnh chụp màn hình](https://github.com/sqlmapproject/sqlmap/wiki/Screenshots), chúng trình bày một số tính năng có thể tìm thấy trong wiki.
Cài đặt
----
Bạn có thể tải xuống tập tin nén tar mới nhất bằng cách nhấp vào [đây](https://github.com/sqlmapproject/sqlmap/tarball/master) hoặc tập tin nén zip mới nhất bằng cách nhấp vào [đây](https://github.com/sqlmapproject/sqlmap/zipball/master).
Tốt hơn là bạn nên tải xuống sqlmap bằng cách clone với [Git](https://github.com/sqlmapproject/sqlmap):
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
sqlmap hoạt động hiệu quả với [Python](http://www.python.org/download/) phiên bản **2.6**, **2.7****3.x** trên bất kì hệ điều hành nào.
Sử dụng
----
Để có được danh sách các tùy chọn cơ bản, hãy sử dụng:
python sqlmap.py -h
Để có được danh sách tất cả các tùy chọn, hãy sử dụng:
python sqlmap.py -hh
Bạn có thể xem video chạy thử [tại đây](https://asciinema.org/a/46601).
Để có cái nhìn tổng quan về các khả năng của sqlmap, danh sách các tính năng được hỗ trợ và mô tả về tất cả các tùy chọn, cùng với các ví dụ, bạn nên tham khảo [hướng dẫn sử dụng](https://github.com/sqlmapproject/sqlmap/wiki/Usage) (Tiếng Anh).
Liên kết
----
* Trang chủ: http://sqlmap.org
* Tải xuống: [.tar.gz](https://github.com/sqlmapproject/sqlmap/tarball/master) hoặc [.zip](https://github.com/sqlmapproject/sqlmap/zipball/master)
* Nguồn cấp dữ liệu RSS về commits: https://github.com/sqlmapproject/sqlmap/commits/master.atom
* Theo dõi vấn đề: https://github.com/sqlmapproject/sqlmap/issues
* Hướng dẫn sử dụng: https://github.com/sqlmapproject/sqlmap/wiki
* Các câu hỏi thường gặp (FAQ): https://github.com/sqlmapproject/sqlmap/wiki/FAQ
* Twitter: [@sqlmap](https://twitter.com/sqlmap)
* Demo: [http://www.youtube.com/user/inquisb/videos](http://www.youtube.com/user/inquisb/videos)
* Ảnh chụp màn hình: https://github.com/sqlmapproject/sqlmap/wiki/Screenshots

View File

@@ -2,7 +2,7 @@
[![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap) [![Build Status](https://api.travis-ci.org/sqlmapproject/sqlmap.svg?branch=master)](https://travis-ci.org/sqlmapproject/sqlmap) [![Python 2.6|2.7|3.x](https://img.shields.io/badge/python-2.6|2.7|3.x-yellow.svg)](https://www.python.org/) [![License](https://img.shields.io/badge/license-GPLv2-red.svg)](https://raw.githubusercontent.com/sqlmapproject/sqlmap/master/LICENSE) [![PyPI version](https://badge.fury.io/py/sqlmap.svg)](https://badge.fury.io/py/sqlmap) [![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sqlmapproject/sqlmap.svg?colorB=ff69b4)](https://github.com/sqlmapproject/sqlmap/issues?q=is%3Aissue+is%3Aclosed) [![Twitter](https://img.shields.io/badge/twitter-@sqlmap-blue.svg)](https://twitter.com/sqlmap)
sqlmap 是一个开源的渗透测试工具可以用来自动化的检测利用SQL注入漏洞获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过带数据连接的方式执行操作系统命令。 sqlmap 是一个开源的渗透测试工具可以用来自动化的检测利用SQL注入漏洞获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过带数据连接的方式执行操作系统命令。
演示截图 演示截图
---- ----

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -3,7 +3,7 @@
""" """
beep.py - Make a beep sound beep.py - Make a beep sound
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -3,7 +3,7 @@
""" """
cloak.py - Simple file encryption/compression utility cloak.py - Simple file encryption/compression utility
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -21,7 +21,7 @@ if sys.version_info >= (3, 0):
xrange = range xrange = range
ord = lambda _: _ ord = lambda _: _
KEY = b"MOZFqVjlk1CY436G" KEY = b"ENWsCymUeJcXqSbD"
def xor(message, key): def xor(message, key):
return b"".join(struct.pack('B', ord(message[i]) ^ ord(key[i % len(key)])) for i in range(len(message))) return b"".join(struct.pack('B', ord(message[i]) ^ ord(key[i % len(key)])) for i in range(len(message)))

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -3,7 +3,7 @@
""" """
dbgtool.py - Portable executable to ASCII debug script converter dbgtool.py - Portable executable to ASCII debug script converter
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# Removes trailing spaces from blank lines inside project files # Removes trailing spaces from blank lines inside project files

View File

@@ -1,13 +1,13 @@
#!/bin/bash #!/bin/bash
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# Stress test against Python3 # Stress test against Python3
export SQLMAP_DREI=1 export SQLMAP_DREI=1
#for i in $(find . -iname "*.py" | grep -v __init__); do python3 -c 'import '`echo $i | cut -d '.' -f 2 | cut -d '/' -f 2- | sed 's/\//./g'`''; done #for i in $(find . -iname "*.py" | grep -v __init__); do python3 -c 'import '`echo $i | cut -d '.' -f 2 | cut -d '/' -f 2- | sed 's/\//./g'`''; done
for i in $(find . -iname "*.py" | grep -v __init__); do PYTHONWARNINGS=all python3.7 -m compileall $i | sed 's/Compiling/Checking/g'; done for i in $(find . -iname "*.py" | grep -v __init__); do PYTHONWARNINGS=all python3 -m compileall $i | sed 's/Compiling/Checking/g'; done
unset SQLMAP_DREI unset SQLMAP_DREI
source `dirname "$0"`"/junk.sh" source `dirname "$0"`"/junk.sh"

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# Removes duplicate entries in wordlist like files # Removes duplicate entries in wordlist like files

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
find . -type d -name "__pycache__" -exec rm -rf {} \; &>/dev/null find . -type d -name "__pycache__" -exec rm -rf {} \; &>/dev/null

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# sudo pip install modernize # sudo pip install modernize

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# Runs pycodestyle on all python files (prerequisite: pip install pycodestyle) # Runs pycodestyle on all python files (prerequisite: pip install pycodestyle)

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# Runs py2diatra on all python files (prerequisite: pip install pydiatra) # Runs py3diatra on all python files (prerequisite: pip install pydiatra)
find . -wholename "./thirdparty" -prune -o -type f -iname "*.py" -exec py2diatra '{}' \; | grep -v bare-except find . -wholename "./thirdparty" -prune -o -type f -iname "*.py" -exec py3diatra '{}' \; | grep -v bare-except

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) # Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission # See the file 'LICENSE' for copying permission
# Runs pyflakes on all python files (prerequisite: apt-get install pyflakes) # Runs pyflakes on all python files (prerequisite: apt-get install pyflakes)

6
extra/shutils/pylint.sh Executable file
View File

@@ -0,0 +1,6 @@
#!/bin/bash
# Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
# See the file 'LICENSE' for copying permission
find . -wholename "./thirdparty" -prune -o -type f -iname "*.py" -exec pylint --rcfile=./.pylintrc '{}' \;

View File

@@ -16,7 +16,7 @@ cat > $TMP_DIR/setup.py << EOF
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -67,7 +67,7 @@ cat > sqlmap/__init__.py << EOF
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -3,7 +3,7 @@
""" """
vulnserver.py - Trivial SQLi vulnerable HTTP server (Note: for testing purposes) vulnserver.py - Trivial SQLi vulnerable HTTP server (Note: for testing purposes)
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -98,6 +98,7 @@ class ReqHandler(BaseHTTPRequestHandler):
if "<script>" in unquote_plus(query): if "<script>" in unquote_plus(query):
self.send_response(INTERNAL_SERVER_ERROR) self.send_response(INTERNAL_SERVER_ERROR)
self.send_header("X-Powered-By", "Express")
self.send_header("Connection", "close") self.send_header("Connection", "close")
self.end_headers() self.end_headers()
self.wfile.write("CLOUDFLARE_ERROR_500S_BOX".encode(UNICODE_ENCODING)) self.wfile.write("CLOUDFLARE_ERROR_500S_BOX".encode(UNICODE_ENCODING))
@@ -128,7 +129,6 @@ class ReqHandler(BaseHTTPRequestHandler):
self.url, self.params = path, params self.url, self.params = path, params
if self.url == '/': if self.url == '/':
if not any(_ in self.params for _ in ("id", "query")): if not any(_ in self.params for _ in ("id", "query")):
self.send_response(OK) self.send_response(OK)
self.send_header("Content-type", "text/html; charset=%s" % UNICODE_ENCODING) self.send_header("Content-type", "text/html; charset=%s" % UNICODE_ENCODING)
@@ -139,10 +139,12 @@ class ReqHandler(BaseHTTPRequestHandler):
code, output = OK, "" code, output = OK, ""
try: try:
if self.params.get("echo", ""): if self.params.get("echo", ""):
output += "%s<br>" % self.params["echo"] output += "%s<br>" % self.params["echo"]
if self.params.get("reflect", ""):
output += "%s<br>" % self.params.get("id")
with _lock: with _lock:
if "query" in self.params: if "query" in self.params:
_cursor.execute(self.params["query"]) _cursor.execute(self.params["query"])
@@ -155,18 +157,22 @@ class ReqHandler(BaseHTTPRequestHandler):
output += "<b>SQL results:</b><br>\n" output += "<b>SQL results:</b><br>\n"
if results: if self.params.get("code", ""):
output += "<table border=\"1\">\n" if not results:
code = INTERNAL_SERVER_ERROR
for row in results:
output += "<tr>"
for value in row:
output += "<td>%s</td>" % value
output += "</tr>\n"
output += "</table>\n"
else: else:
output += "no results found" if results:
output += "<table border=\"1\">\n"
for row in results:
output += "<tr>"
for value in row:
output += "<td>%s</td>" % value
output += "</tr>\n"
output += "</table>\n"
else:
output += "no results found"
output += "</body></html>" output += "</body></html>"
except Exception as ex: except Exception as ex:
@@ -193,7 +199,7 @@ class ReqHandler(BaseHTTPRequestHandler):
self.do_REQUEST() self.do_REQUEST()
def do_PUT(self): def do_PUT(self):
self.do_REQUEST() self.do_POST()
def do_HEAD(self): def do_HEAD(self):
self.do_REQUEST() self.do_REQUEST()

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -30,6 +30,7 @@ from lib.core.common import getSortedInjectionTests
from lib.core.common import hashDBRetrieve from lib.core.common import hashDBRetrieve
from lib.core.common import hashDBWrite from lib.core.common import hashDBWrite
from lib.core.common import intersect from lib.core.common import intersect
from lib.core.common import isDigit
from lib.core.common import joinValue from lib.core.common import joinValue
from lib.core.common import listToStrValue from lib.core.common import listToStrValue
from lib.core.common import parseFilePaths from lib.core.common import parseFilePaths
@@ -117,7 +118,7 @@ def checkSqlInjection(place, parameter, value):
threadData = getCurrentThreadData() threadData = getCurrentThreadData()
# Favoring non-string specific boundaries in case of digit-like parameter values # Favoring non-string specific boundaries in case of digit-like parameter values
if value.isdigit(): if isDigit(value):
kb.cache.intBoundaries = kb.cache.intBoundaries or sorted(copy.deepcopy(conf.boundaries), key=lambda boundary: any(_ in (boundary.prefix or "") or _ in (boundary.suffix or "") for _ in ('"', '\''))) kb.cache.intBoundaries = kb.cache.intBoundaries or sorted(copy.deepcopy(conf.boundaries), key=lambda boundary: any(_ in (boundary.prefix or "") or _ in (boundary.suffix or "") for _ in ('"', '\'')))
boundaries = kb.cache.intBoundaries boundaries = kb.cache.intBoundaries
elif value.isalpha(): elif value.isalpha():
@@ -156,6 +157,7 @@ def checkSqlInjection(place, parameter, value):
# error message, simple heuristic check or via DBMS-specific # error message, simple heuristic check or via DBMS-specific
# payload), ask the user to limit the tests to the fingerprinted # payload), ask the user to limit the tests to the fingerprinted
# DBMS # DBMS
if kb.reduceTests is None and not conf.testFilter and (intersect(Backend.getErrorParsedDBMSes(), SUPPORTED_DBMS, True) or kb.heuristicDbms or injection.dbms): if kb.reduceTests is None and not conf.testFilter and (intersect(Backend.getErrorParsedDBMSes(), SUPPORTED_DBMS, True) or kb.heuristicDbms or injection.dbms):
msg = "it looks like the back-end DBMS is '%s'. " % (Format.getErrorParsedDBMSes() or kb.heuristicDbms or joinValue(injection.dbms, '/')) msg = "it looks like the back-end DBMS is '%s'. " % (Format.getErrorParsedDBMSes() or kb.heuristicDbms or joinValue(injection.dbms, '/'))
msg += "Do you want to skip test payloads specific for other DBMSes? [Y/n]" msg += "Do you want to skip test payloads specific for other DBMSes? [Y/n]"
@@ -226,8 +228,8 @@ def checkSqlInjection(place, parameter, value):
# Skip test if the user's wants to test only for a specific # Skip test if the user's wants to test only for a specific
# technique # technique
if conf.technique and isinstance(conf.technique, list) and stype not in conf.technique: if conf.technique and isinstance(conf.technique, list) and stype not in conf.technique:
debugMsg = "skipping test '%s' because the user " % title debugMsg = "skipping test '%s' because user " % title
debugMsg += "specified to test only for " debugMsg += "specified testing of only "
debugMsg += "%s techniques" % " & ".join(PAYLOAD.SQLINJECTION[_] for _ in conf.technique) debugMsg += "%s techniques" % " & ".join(PAYLOAD.SQLINJECTION[_] for _ in conf.technique)
logger.debug(debugMsg) logger.debug(debugMsg)
continue continue
@@ -402,8 +404,8 @@ def checkSqlInjection(place, parameter, value):
continue continue
# Parse boundary's <prefix>, <suffix> and <ptype> # Parse boundary's <prefix>, <suffix> and <ptype>
prefix = boundary.prefix if boundary.prefix else "" prefix = boundary.prefix or ""
suffix = boundary.suffix if boundary.suffix else "" suffix = boundary.suffix or ""
ptype = boundary.ptype ptype = boundary.ptype
# Options --prefix/--suffix have a higher priority (if set by user) # Options --prefix/--suffix have a higher priority (if set by user)
@@ -527,7 +529,7 @@ def checkSqlInjection(place, parameter, value):
truePage, trueHeaders, trueCode = threadData.lastComparisonPage or "", threadData.lastComparisonHeaders, threadData.lastComparisonCode truePage, trueHeaders, trueCode = threadData.lastComparisonPage or "", threadData.lastComparisonHeaders, threadData.lastComparisonCode
trueRawResponse = "%s%s" % (trueHeaders, truePage) trueRawResponse = "%s%s" % (trueHeaders, truePage)
if trueResult and not(truePage == falsePage and not kb.nullConnection): if trueResult and not(truePage == falsePage and not any((kb.nullConnection, conf.code))):
# Perform the test's False request # Perform the test's False request
falseResult = Request.queryPage(genCmpPayload(), place, raise404=False) falseResult = Request.queryPage(genCmpPayload(), place, raise404=False)
@@ -640,7 +642,7 @@ def checkSqlInjection(place, parameter, value):
output = output or extractRegexResult(check, threadData.lastRedirectMsg[1] if threadData.lastRedirectMsg and threadData.lastRedirectMsg[0] == threadData.lastRequestUID else None, re.DOTALL | re.IGNORECASE) output = output or extractRegexResult(check, threadData.lastRedirectMsg[1] if threadData.lastRedirectMsg and threadData.lastRedirectMsg[0] == threadData.lastRequestUID else None, re.DOTALL | re.IGNORECASE)
if output: if output:
result = output == "1" result = output == '1'
if result: if result:
infoMsg = "%sparameter '%s' is '%s' injectable " % ("%s " % paramType if paramType != parameter else "", parameter, title) infoMsg = "%sparameter '%s' is '%s' injectable " % ("%s " % paramType if paramType != parameter else "", parameter, title)
@@ -651,7 +653,7 @@ def checkSqlInjection(place, parameter, value):
except SqlmapConnectionException as ex: except SqlmapConnectionException as ex:
debugMsg = "problem occurred most likely because the " debugMsg = "problem occurred most likely because the "
debugMsg += "server hasn't recovered as expected from the " debugMsg += "server hasn't recovered as expected from the "
debugMsg += "error-based payload used ('%s')" % getSafeExString(ex) debugMsg += "used error-based payload ('%s')" % getSafeExString(ex)
logger.debug(debugMsg) logger.debug(debugMsg)
# In case of time-based blind or stacked queries # In case of time-based blind or stacked queries
@@ -855,7 +857,9 @@ def checkSqlInjection(place, parameter, value):
logger.warn(warnMsg) logger.warn(warnMsg)
if not checkFalsePositives(injection): if not checkFalsePositives(injection):
kb.vulnHosts.remove(conf.hostname) if conf.hostname in kb.vulnHosts:
kb.vulnHosts.remove(conf.hostname)
if NOTE.FALSE_POSITIVE_OR_UNEXPLOITABLE not in injection.notes: if NOTE.FALSE_POSITIVE_OR_UNEXPLOITABLE not in injection.notes:
injection.notes.append(NOTE.FALSE_POSITIVE_OR_UNEXPLOITABLE) injection.notes.append(NOTE.FALSE_POSITIVE_OR_UNEXPLOITABLE)
@@ -876,8 +880,12 @@ def heuristicCheckDbms(injection):
to identify with a simple DBMS specific boolean-based test what the DBMS to identify with a simple DBMS specific boolean-based test what the DBMS
may be may be
""" """
retVal = False retVal = False
if conf.skipHeuristics:
return retVal
pushValue(kb.injection) pushValue(kb.injection)
kb.injection = injection kb.injection = injection
@@ -983,7 +991,7 @@ def checkSuhosinPatch(injection):
Checks for existence of Suhosin-patch (and alike) protection mechanism(s) Checks for existence of Suhosin-patch (and alike) protection mechanism(s)
""" """
if injection.place == PLACE.GET: if injection.place in (PLACE.GET, PLACE.URI):
debugMsg = "checking for parameter length " debugMsg = "checking for parameter length "
debugMsg += "constraining mechanisms" debugMsg += "constraining mechanisms"
logger.debug(debugMsg) logger.debug(debugMsg)
@@ -1031,9 +1039,7 @@ def checkFilteredChars(injection):
kb.injection = popValue() kb.injection = popValue()
def heuristicCheckSqlInjection(place, parameter): def heuristicCheckSqlInjection(place, parameter):
if kb.heavilyDynamic: if conf.skipHeuristics:
debugMsg = "heuristic check skipped because of heavy dynamicity"
logger.debug(debugMsg)
return None return None
origValue = conf.paramDict[place][parameter] origValue = conf.paramDict[place][parameter]
@@ -1072,7 +1078,7 @@ def heuristicCheckSqlInjection(place, parameter):
casting = _(page) and not _(kb.originalPage) casting = _(page) and not _(kb.originalPage)
if not casting and not result and kb.dynamicParameter and origValue.isdigit(): if not casting and not result and kb.dynamicParameter and origValue.isdigit() and not kb.heavilyDynamic:
randInt = int(randomInt()) randInt = int(randomInt())
payload = "%s%s%s" % (prefix, "%d-%d" % (int(origValue) + randInt, randInt), suffix) payload = "%s%s%s" % (prefix, "%d-%d" % (int(origValue) + randInt, randInt), suffix)
payload = agent.payload(place, parameter, newValue=payload, where=PAYLOAD.WHERE.REPLACE) payload = agent.payload(place, parameter, newValue=payload, where=PAYLOAD.WHERE.REPLACE)
@@ -1086,6 +1092,11 @@ def heuristicCheckSqlInjection(place, parameter):
kb.heuristicTest = HEURISTIC_TEST.CASTED if casting else HEURISTIC_TEST.NEGATIVE if not result else HEURISTIC_TEST.POSITIVE kb.heuristicTest = HEURISTIC_TEST.CASTED if casting else HEURISTIC_TEST.NEGATIVE if not result else HEURISTIC_TEST.POSITIVE
if kb.heavilyDynamic:
debugMsg = "heuristic check stopped because of heavy dynamicity"
logger.debug(debugMsg)
return kb.heuristicTest
if casting: if casting:
errMsg = "possible %s casting detected (e.g. '" % ("integer" if origValue.isdigit() else "type") errMsg = "possible %s casting detected (e.g. '" % ("integer" if origValue.isdigit() else "type")
@@ -1127,14 +1138,22 @@ def heuristicCheckSqlInjection(place, parameter):
paramType = conf.method if conf.method not in (None, HTTPMETHOD.GET, HTTPMETHOD.POST) else place paramType = conf.method if conf.method not in (None, HTTPMETHOD.GET, HTTPMETHOD.POST) else place
if value.lower() in (page or "").lower(): # Reference: https://bugs.python.org/issue18183
if value.upper() in (page or "").upper():
infoMsg = "heuristic (XSS) test shows that %sparameter '%s' might be vulnerable to cross-site scripting (XSS) attacks" % ("%s " % paramType if paramType != parameter else "", parameter) infoMsg = "heuristic (XSS) test shows that %sparameter '%s' might be vulnerable to cross-site scripting (XSS) attacks" % ("%s " % paramType if paramType != parameter else "", parameter)
logger.info(infoMsg) logger.info(infoMsg)
if conf.beep:
beep()
for match in re.finditer(FI_ERROR_REGEX, page or ""): for match in re.finditer(FI_ERROR_REGEX, page or ""):
if randStr1.lower() in match.group(0).lower(): if randStr1.lower() in match.group(0).lower():
infoMsg = "heuristic (FI) test shows that %sparameter '%s' might be vulnerable to file inclusion (FI) attacks" % ("%s " % paramType if paramType != parameter else "", parameter) infoMsg = "heuristic (FI) test shows that %sparameter '%s' might be vulnerable to file inclusion (FI) attacks" % ("%s " % paramType if paramType != parameter else "", parameter)
logger.info(infoMsg) logger.info(infoMsg)
if conf.beep:
beep()
break break
kb.disableHtmlDecoding = False kb.disableHtmlDecoding = False
@@ -1149,7 +1168,7 @@ def checkDynParam(place, parameter, value):
dynamicity might depend on another parameter. dynamicity might depend on another parameter.
""" """
if kb.redirectChoice: if kb.choices.redirect:
return None return None
kb.matchRatio = None kb.matchRatio = None
@@ -1250,7 +1269,7 @@ def checkStability():
secondPage, _, _ = Request.queryPage(content=True, noteResponseTime=False, raise404=False) secondPage, _, _ = Request.queryPage(content=True, noteResponseTime=False, raise404=False)
if kb.redirectChoice: if kb.choices.redirect:
return None return None
kb.pageStable = (firstPage == secondPage) kb.pageStable = (firstPage == secondPage)
@@ -1397,11 +1416,11 @@ def checkWaf():
value = "" if not conf.parameters.get(PLACE.GET) else conf.parameters[PLACE.GET] + DEFAULT_GET_POST_DELIMITER value = "" if not conf.parameters.get(PLACE.GET) else conf.parameters[PLACE.GET] + DEFAULT_GET_POST_DELIMITER
value += "%s=%s" % (randomStr(), agent.addPayloadDelimiters(payload)) value += "%s=%s" % (randomStr(), agent.addPayloadDelimiters(payload))
pushValue(kb.redirectChoice) pushValue(kb.choices.redirect)
pushValue(kb.resendPostOnRedirect) pushValue(kb.resendPostOnRedirect)
pushValue(conf.timeout) pushValue(conf.timeout)
kb.redirectChoice = REDIRECTION.YES kb.choices.redirect = REDIRECTION.YES
kb.resendPostOnRedirect = False kb.resendPostOnRedirect = False
conf.timeout = IPS_WAF_CHECK_TIMEOUT conf.timeout = IPS_WAF_CHECK_TIMEOUT
@@ -1414,7 +1433,7 @@ def checkWaf():
conf.timeout = popValue() conf.timeout = popValue()
kb.resendPostOnRedirect = popValue() kb.resendPostOnRedirect = popValue()
kb.redirectChoice = popValue() kb.choices.redirect = popValue()
hashDBWrite(HASHDB_KEYS.CHECK_WAF_RESULT, retVal, True) hashDBWrite(HASHDB_KEYS.CHECK_WAF_RESULT, retVal, True)
@@ -1547,7 +1566,7 @@ def checkConnection(suppressOutput=False):
else: else:
kb.errorIsNone = True kb.errorIsNone = True
if kb.redirectChoice == REDIRECTION.YES and threadData.lastRedirectURL and threadData.lastRedirectURL[0] == threadData.lastRequestUID: if kb.choices.redirect == REDIRECTION.YES and threadData.lastRedirectURL and threadData.lastRedirectURL[0] == threadData.lastRequestUID:
if (threadData.lastRedirectURL[1] or "").startswith("https://") and conf.hostname in getUnicode(threadData.lastRedirectURL[1]): if (threadData.lastRedirectURL[1] or "").startswith("https://") and conf.hostname in getUnicode(threadData.lastRedirectURL[1]):
conf.url = re.sub(r"https?://", "https://", conf.url) conf.url = re.sub(r"https?://", "https://", conf.url)
match = re.search(r":(\d+)", threadData.lastRedirectURL[1]) match = re.search(r":(\d+)", threadData.lastRedirectURL[1])

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -291,7 +291,7 @@ def start():
logger.error(errMsg) logger.error(errMsg)
return False return False
if kb.targets and len(kb.targets) > 1: if kb.targets and isListLike(kb.targets) and len(kb.targets) > 1:
infoMsg = "found a total of %d targets" % len(kb.targets) infoMsg = "found a total of %d targets" % len(kb.targets)
logger.info(infoMsg) logger.info(infoMsg)
@@ -452,7 +452,6 @@ def start():
checkNullConnection() checkNullConnection()
if (len(kb.injections) == 0 or (len(kb.injections) == 1 and kb.injections[0].place is None)) and (kb.injection.place is None or kb.injection.parameter is None): if (len(kb.injections) == 0 or (len(kb.injections) == 1 and kb.injections[0].place is None)) and (kb.injection.place is None or kb.injection.parameter is None):
if not any((conf.string, conf.notString, conf.regexp)) and PAYLOAD.TECHNIQUE.BOOLEAN in conf.technique: if not any((conf.string, conf.notString, conf.regexp)) and PAYLOAD.TECHNIQUE.BOOLEAN in conf.technique:
# NOTE: this is not needed anymore, leaving only to display # NOTE: this is not needed anymore, leaving only to display
# a warning message to the user in case the page is not stable # a warning message to the user in case the page is not stable
@@ -704,6 +703,12 @@ def start():
action() action()
except KeyboardInterrupt: except KeyboardInterrupt:
if kb.lastCtrlCTime and (time.time() - kb.lastCtrlCTime < 1):
kb.multipleCtrlC = True
raise SqlmapUserQuitException("user aborted (Ctrl+C was pressed multiple times)")
kb.lastCtrlCTime = time.time()
if conf.multipleTargets: if conf.multipleTargets:
warnMsg = "user aborted in multiple target mode" warnMsg = "user aborted in multiple target mode"
logger.warn(warnMsg) logger.warn(warnMsg)

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -33,9 +33,11 @@ from lib.core.settings import MYSQL_ALIASES
from lib.core.settings import ORACLE_ALIASES from lib.core.settings import ORACLE_ALIASES
from lib.core.settings import PGSQL_ALIASES from lib.core.settings import PGSQL_ALIASES
from lib.core.settings import PRESTO_ALIASES from lib.core.settings import PRESTO_ALIASES
from lib.core.settings import RAIMA_ALIASES
from lib.core.settings import SQLITE_ALIASES from lib.core.settings import SQLITE_ALIASES
from lib.core.settings import SYBASE_ALIASES from lib.core.settings import SYBASE_ALIASES
from lib.core.settings import VERTICA_ALIASES from lib.core.settings import VERTICA_ALIASES
from lib.core.settings import VIRTUOSO_ALIASES
from lib.utils.sqlalchemy import SQLAlchemy from lib.utils.sqlalchemy import SQLAlchemy
from plugins.dbms.access.connector import Connector as AccessConn from plugins.dbms.access.connector import Connector as AccessConn
@@ -82,12 +84,16 @@ from plugins.dbms.postgresql.connector import Connector as PostgreSQLConn
from plugins.dbms.postgresql import PostgreSQLMap from plugins.dbms.postgresql import PostgreSQLMap
from plugins.dbms.presto.connector import Connector as PrestoConn from plugins.dbms.presto.connector import Connector as PrestoConn
from plugins.dbms.presto import PrestoMap from plugins.dbms.presto import PrestoMap
from plugins.dbms.raima.connector import Connector as RaimaConn
from plugins.dbms.raima import RaimaMap
from plugins.dbms.sqlite.connector import Connector as SQLiteConn from plugins.dbms.sqlite.connector import Connector as SQLiteConn
from plugins.dbms.sqlite import SQLiteMap from plugins.dbms.sqlite import SQLiteMap
from plugins.dbms.sybase.connector import Connector as SybaseConn from plugins.dbms.sybase.connector import Connector as SybaseConn
from plugins.dbms.sybase import SybaseMap from plugins.dbms.sybase import SybaseMap
from plugins.dbms.vertica.connector import Connector as VerticaConn from plugins.dbms.vertica.connector import Connector as VerticaConn
from plugins.dbms.vertica import VerticaMap from plugins.dbms.vertica import VerticaMap
from plugins.dbms.virtuoso.connector import Connector as VirtuosoConn
from plugins.dbms.virtuoso import VirtuosoMap
def setHandler(): def setHandler():
""" """
@@ -121,6 +127,8 @@ def setHandler():
(DBMS.CACHE, CACHE_ALIASES, CacheMap, CacheConn), (DBMS.CACHE, CACHE_ALIASES, CacheMap, CacheConn),
(DBMS.EXTREMEDB, EXTREMEDB_ALIASES, ExtremeDBMap, ExtremeDBConn), (DBMS.EXTREMEDB, EXTREMEDB_ALIASES, ExtremeDBMap, ExtremeDBConn),
(DBMS.FRONTBASE, FRONTBASE_ALIASES, FrontBaseMap, FrontBaseConn), (DBMS.FRONTBASE, FRONTBASE_ALIASES, FrontBaseMap, FrontBaseConn),
(DBMS.RAIMA, RAIMA_ALIASES, RaimaMap, RaimaConn),
(DBMS.VIRTUOSO, VIRTUOSO_ALIASES, VirtuosoMap, VirtuosoConn),
] ]
_ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items) _ = max(_ if (conf.get("dbms") or Backend.getIdentifiedDbms() or kb.heuristicExtendedDbms or "").lower() in _[1] else () for _ in items)

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -471,6 +471,12 @@ class Agent(object):
@rtype: C{str} @rtype: C{str}
""" """
match = re.search(r"(?i)(.+)( AS \w+)\Z", field)
if match:
field, suffix = match.groups()
else:
suffix = ""
nulledCastedField = field nulledCastedField = field
if field and Backend.getIdentifiedDbms(): if field and Backend.getIdentifiedDbms():
@@ -481,7 +487,10 @@ class Agent(object):
else: else:
if not (Backend.isDbms(DBMS.SQLITE) and not isDBMSVersionAtLeast('3')): if not (Backend.isDbms(DBMS.SQLITE) and not isDBMSVersionAtLeast('3')):
nulledCastedField = rootQuery.cast.query % field nulledCastedField = rootQuery.cast.query % field
if Backend.getIdentifiedDbms() in (DBMS.ACCESS, DBMS.MCKOI):
if re.search(r"COUNT\(", field) and Backend.getIdentifiedDbms() in (DBMS.RAIMA,):
pass
elif Backend.getIdentifiedDbms() in (DBMS.ACCESS, DBMS.MCKOI):
nulledCastedField = rootQuery.isnull.query % (nulledCastedField, nulledCastedField) nulledCastedField = rootQuery.isnull.query % (nulledCastedField, nulledCastedField)
else: else:
nulledCastedField = rootQuery.isnull.query % nulledCastedField nulledCastedField = rootQuery.isnull.query % nulledCastedField
@@ -490,6 +499,12 @@ class Agent(object):
if conf.hexConvert or kb.binaryField: if conf.hexConvert or kb.binaryField:
nulledCastedField = self.hexConvertField(nulledCastedField) nulledCastedField = self.hexConvertField(nulledCastedField)
if suffix:
nulledCastedField += suffix
if not kb.nchar:
nulledCastedField = re.sub(r"( AS )N(CHAR|VARCHAR)", r"\g<1>\g<2>", nulledCastedField)
return nulledCastedField return nulledCastedField
def nullCastConcatFields(self, fields): def nullCastConcatFields(self, fields):
@@ -533,6 +548,7 @@ class Agent(object):
nulledCastedFields = [] nulledCastedFields = []
for field in fieldsSplitted: for field in fieldsSplitted:
field = re.sub(r"(?i) AS \w+\Z", "", field) # NOTE: fields such as "... AS type_name" have to be stripped from the alias part for this functionality to work
nulledCastedFields.append(self.nullAndCastField(field)) nulledCastedFields.append(self.nullAndCastField(field))
delimiterStr = "%s'%s'%s" % (dbmsDelimiter, kb.chars.delimiter, dbmsDelimiter) delimiterStr = "%s'%s'%s" % (dbmsDelimiter, kb.chars.delimiter, dbmsDelimiter)
@@ -683,7 +699,7 @@ class Agent(object):
elif fieldsNoSelect: elif fieldsNoSelect:
concatenatedQuery = "CONCAT('%s',%s,'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop) concatenatedQuery = "CONCAT('%s',%s,'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop)
elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE, DBMS.SQLITE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CUBRID, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE): elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.ORACLE, DBMS.SQLITE, DBMS.DB2, DBMS.FIREBIRD, DBMS.HSQLDB, DBMS.H2, DBMS.MONETDB, DBMS.DERBY, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.ALTIBASE, DBMS.MIMERSQL, DBMS.CRATEDB, DBMS.CUBRID, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO):
if fieldsExists: if fieldsExists:
concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'||" % kb.chars.start, 1) concatenatedQuery = concatenatedQuery.replace("SELECT ", "'%s'||" % kb.chars.start, 1)
concatenatedQuery += "||'%s'" % kb.chars.stop concatenatedQuery += "||'%s'" % kb.chars.stop
@@ -779,7 +795,6 @@ class Agent(object):
elif fieldsNoSelect: elif fieldsNoSelect:
concatenatedQuery = "CONCAT(CONCAT('%s',%s),'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop) concatenatedQuery = "CONCAT(CONCAT('%s',%s),'%s')" % (kb.chars.start, concatenatedQuery, kb.chars.stop)
return concatenatedQuery return concatenatedQuery
def forgeUnionQuery(self, query, position, count, comment, prefix, suffix, char, where, multipleUnions=None, limited=False, fromTable=None): def forgeUnionQuery(self, query, position, count, comment, prefix, suffix, char, where, multipleUnions=None, limited=False, fromTable=None):
@@ -994,7 +1009,7 @@ class Agent(object):
fromFrom = limitedQuery[fromIndex + 1:] fromFrom = limitedQuery[fromIndex + 1:]
orderBy = None orderBy = None
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.SQLITE, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO, DBMS.MIMERSQL, DBMS.CUBRID, DBMS.EXTREMEDB): if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.PGSQL, DBMS.SQLITE, DBMS.H2, DBMS.VERTICA, DBMS.PRESTO, DBMS.MIMERSQL, DBMS.CUBRID, DBMS.EXTREMEDB, DBMS.RAIMA):
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1) limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1)
limitedQuery += " %s" % limitStr limitedQuery += " %s" % limitStr
@@ -1006,7 +1021,7 @@ class Agent(object):
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num) limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (1, num)
limitedQuery += " %s" % limitStr limitedQuery += " %s" % limitStr
elif Backend.getIdentifiedDbms() in (DBMS.FRONTBASE,): elif Backend.getIdentifiedDbms() in (DBMS.FRONTBASE, DBMS.VIRTUOSO):
limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1) limitStr = queries[Backend.getIdentifiedDbms()].limit.query % (num, 1)
if query.startswith("SELECT "): if query.startswith("SELECT "):
limitedQuery = query.replace("SELECT ", "SELECT %s " % limitStr, 1) limitedQuery = query.replace("SELECT ", "SELECT %s " % limitStr, 1)
@@ -1207,7 +1222,7 @@ class Agent(object):
def whereQuery(self, query): def whereQuery(self, query):
if conf.dumpWhere and query: if conf.dumpWhere and query:
if Backend.isDbms(DBMS.ORACLE) and re.search("qq ORDER BY \w+\)", query, re.I) is not None: if Backend.isDbms(DBMS.ORACLE) and re.search(r"qq ORDER BY \w+\)", query, re.I) is not None:
prefix, suffix = re.sub(r"(?i)(qq)( ORDER BY \w+\))", r"\g<1> WHERE %s\g<2>" % conf.dumpWhere, query), "" prefix, suffix = re.sub(r"(?i)(qq)( ORDER BY \w+\))", r"\g<1> WHERE %s\g<2>" % conf.dumpWhere, query), ""
else: else:
match = re.search(r" (LIMIT|ORDER).+", query, re.I) match = re.search(r" (LIMIT|ORDER).+", query, re.I)
@@ -1225,7 +1240,7 @@ class Agent(object):
prefix += " WHERE %s" % conf.dumpWhere prefix += " WHERE %s" % conf.dumpWhere
query = prefix query = prefix
if suffix: if suffix and not all(re.search(r"ORDER BY", _, re.I) is not None for _ in (query, suffix)):
query += suffix query += suffix
return query return query

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -22,7 +22,10 @@ from lib.core.exception import SqlmapSystemException
from lib.core.settings import BIGARRAY_CHUNK_SIZE from lib.core.settings import BIGARRAY_CHUNK_SIZE
from lib.core.settings import BIGARRAY_COMPRESS_LEVEL from lib.core.settings import BIGARRAY_COMPRESS_LEVEL
DEFAULT_SIZE_OF = sys.getsizeof(object()) try:
DEFAULT_SIZE_OF = sys.getsizeof(object())
except TypeError:
DEFAULT_SIZE_OF = 16
def _size_of(instance): def _size_of(instance):
""" """
@@ -56,6 +59,12 @@ class BigArray(list):
>>> _[20] = 0 >>> _[20] = 0
>>> _[99999] >>> _[99999]
99999 99999
>>> _ += [0]
>>> _[100000]
0
>>> _ = _ + [1]
>>> _[-1]
1
""" """
def __init__(self, items=None): def __init__(self, items=None):
@@ -69,6 +78,20 @@ class BigArray(list):
for item in (items or []): for item in (items or []):
self.append(item) self.append(item)
def __add__(self, value):
retval = BigArray(self)
for _ in value:
retval.append(_)
return retval
def __iadd__(self, value):
for _ in value:
self.append(_)
return self
def append(self, value): def append(self, value):
self.chunks[-1].append(value) self.chunks[-1].append(value)
@@ -145,7 +168,7 @@ class BigArray(list):
self.chunks, self.filenames = state self.chunks, self.filenames = state
def __getitem__(self, y): def __getitem__(self, y):
if y < 0: while y < 0:
y += len(self) y += len(self)
index = y // self.chunk_length index = y // self.chunk_length

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -9,9 +9,9 @@ from __future__ import division
import binascii import binascii
import codecs import codecs
import collections
import contextlib import contextlib
import copy import copy
import distutils.version
import functools import functools
import getpass import getpass
import hashlib import hashlib
@@ -193,6 +193,7 @@ from thirdparty.colorama.initialise import init as coloramainit
from thirdparty.magic import magic from thirdparty.magic import magic
from thirdparty.odict import OrderedDict from thirdparty.odict import OrderedDict
from thirdparty.six import unichr as _unichr from thirdparty.six import unichr as _unichr
from thirdparty.six.moves import collections_abc as _collections
from thirdparty.six.moves import configparser as _configparser from thirdparty.six.moves import configparser as _configparser
from thirdparty.six.moves import http_client as _http_client from thirdparty.six.moves import http_client as _http_client
from thirdparty.six.moves import input as _input from thirdparty.six.moves import input as _input
@@ -215,7 +216,7 @@ class UnicodeRawConfigParser(_configparser.RawConfigParser):
fp.write("[%s]\n" % _configparser.DEFAULTSECT) fp.write("[%s]\n" % _configparser.DEFAULTSECT)
for (key, value) in self._defaults.items(): for (key, value) in self._defaults.items():
fp.write("%s = %s\n" % (key, getUnicode(value, UNICODE_ENCODING).replace('\n', '\n\t'))) fp.write("%s = %s" % (key, getUnicode(value, UNICODE_ENCODING)))
fp.write("\n") fp.write("\n")
@@ -226,8 +227,8 @@ class UnicodeRawConfigParser(_configparser.RawConfigParser):
if key != "__name__": if key != "__name__":
if value is None: if value is None:
fp.write("%s\n" % (key)) fp.write("%s\n" % (key))
else: elif not isListLike(value):
fp.write("%s = %s\n" % (key, getUnicode(value, UNICODE_ENCODING).replace('\n', '\n\t'))) fp.write("%s = %s\n" % (key, getUnicode(value, UNICODE_ENCODING)))
fp.write("\n") fp.write("\n")
@@ -586,7 +587,15 @@ class Backend(object):
@staticmethod @staticmethod
def isVersionGreaterOrEqualThan(version): def isVersionGreaterOrEqualThan(version):
return Backend.getVersion() is not None and str(Backend.getVersion()) >= str(version) retVal = False
if Backend.getVersion() is not None and version is not None:
try:
retVal = distutils.version.LooseVersion(Backend.getVersion()) >= distutils.version.LooseVersion(version)
except:
retVal = str(Backend.getVersion()) >= str(version)
return retVal
@staticmethod @staticmethod
def isOs(os): def isOs(os):
@@ -965,14 +974,15 @@ def setColor(message, color=None, bold=False, level=None, istty=None):
level = getattr(logging, level, None) level = getattr(logging, level, None)
except: except:
level = None level = None
retVal = LOGGER_HANDLER.colorize(message, level) retVal = LOGGER_HANDLER.colorize(message, level, True)
else: else:
match = re.search(r"\(([^)]*)\s*fork\)", message) match = re.search(r"\(([^)]*)\s*fork\)", message)
if match: if match:
retVal = retVal.replace(match.group(1), colored(match.group(1), color="lightgrey")) retVal = retVal.replace(match.group(1), colored(match.group(1), color="lightgrey"))
for match in re.finditer(r"([^\w])'([^\n']+)'", message): # single-quoted (Note: watch-out for the banner) if not any(_ in message for _ in ("Payload: ",)):
retVal = retVal.replace(match.group(0), "%s'%s'" % (match.group(1), colored(match.group(2), color="lightgrey"))) for match in re.finditer(r"([^\w])'([^\n']+)'", message): # single-quoted (Note: watch-out for the banner)
retVal = retVal.replace(match.group(0), "%s'%s'" % (match.group(1), colored(match.group(2), color="lightgrey")))
message = message.strip() message = message.strip()
@@ -1049,7 +1059,8 @@ def dataToDumpFile(dumpFile, data):
errMsg = "permission denied when flushing dump data" errMsg = "permission denied when flushing dump data"
logger.error(errMsg) logger.error(errMsg)
else: else:
raise errMsg = "error occurred when writing dump data to file ('%s')" % getUnicode(ex)
logger.error(errMsg)
def dataToOutFile(filename, data): def dataToOutFile(filename, data):
""" """
@@ -1260,6 +1271,8 @@ def sanitizeStr(value):
>>> sanitizeStr('foo\\n\\rbar') == 'foo bar' >>> sanitizeStr('foo\\n\\rbar') == 'foo bar'
True True
>>> sanitizeStr(None) == 'None'
True
""" """
return getUnicode(value).replace("\n", " ").replace("\r", "") return getUnicode(value).replace("\n", " ").replace("\r", "")
@@ -1518,7 +1531,7 @@ def parseTargetDirect():
remote = False remote = False
for dbms in SUPPORTED_DBMS: for dbms in SUPPORTED_DBMS:
details = re.search(r"^(?P<dbms>%s)://(?P<credentials>(?P<user>.*?)\:(?P<pass>.*)\@)?(?P<remote>(?P<hostname>[\w.-]+?)\:(?P<port>[\d]+)\/)?(?P<db>[\w\d\ \:\.\_\-\/\\]+?)$" % dbms, conf.direct, re.I) details = re.search(r"^(?P<dbms>%s)://(?P<credentials>(?P<user>.*?)\:(?P<pass>.*)\@)?(?P<remote>(?P<hostname>[\w.-]+?)\:(?P<port>[\d]+)\/)?(?P<db>[\w\d\ \:\.\_\-\/\\]*)$" % dbms, conf.direct, re.I)
if details: if details:
conf.dbms = details.group("dbms") conf.dbms = details.group("dbms")
@@ -1749,7 +1762,7 @@ def expandAsteriskForColumns(expression):
the SQL query string (expression) the SQL query string (expression)
""" """
match = re.search(r"(?i)\ASELECT(\s+TOP\s+[\d]+)?\s+\*\s+FROM\s+`?([^`\s()]+)", expression) match = re.search(r"(?i)\ASELECT(\s+TOP\s+[\d]+)?\s+\*\s+FROM\s+((`[^`]+`|[^\s]+)+)", expression)
if match: if match:
infoMsg = "you did not provide the fields in your query. " infoMsg = "you did not provide the fields in your query. "
@@ -1819,6 +1832,9 @@ def getLimitRange(count, plusOne=False):
def parseUnionPage(page): def parseUnionPage(page):
""" """
Returns resulting items from UNION query inside provided page content Returns resulting items from UNION query inside provided page content
>>> parseUnionPage("%sfoo%s%sbar%s" % (kb.chars.start, kb.chars.stop, kb.chars.start, kb.chars.stop))
['foo', 'bar']
""" """
if page is None: if page is None:
@@ -2052,6 +2068,9 @@ def safeFilepathEncode(filepath):
def safeExpandUser(filepath): def safeExpandUser(filepath):
""" """
Patch for a Python Issue18171 (http://bugs.python.org/issue18171) Patch for a Python Issue18171 (http://bugs.python.org/issue18171)
>>> os.path.basename(__file__) in safeExpandUser(__file__)
True
""" """
retVal = filepath retVal = filepath
@@ -2071,6 +2090,8 @@ def safeStringFormat(format_, params):
>>> safeStringFormat('SELECT foo FROM %s LIMIT %d', ('bar', '1')) >>> safeStringFormat('SELECT foo FROM %s LIMIT %d', ('bar', '1'))
'SELECT foo FROM bar LIMIT 1' 'SELECT foo FROM bar LIMIT 1'
>>> safeStringFormat("SELECT foo FROM %s WHERE name LIKE '%susan%' LIMIT %d", ('bar', '1'))
"SELECT foo FROM bar WHERE name LIKE '%susan%' LIMIT 1"
""" """
if format_.count(PAYLOAD_DELIMITER) == 2: if format_.count(PAYLOAD_DELIMITER) == 2:
@@ -2114,7 +2135,10 @@ def safeStringFormat(format_, params):
warnMsg += "Please report by e-mail content \"%r | %r | %r\" to '%s'" % (format_, params, retVal, DEV_EMAIL_ADDRESS) warnMsg += "Please report by e-mail content \"%r | %r | %r\" to '%s'" % (format_, params, retVal, DEV_EMAIL_ADDRESS)
raise SqlmapValueException(warnMsg) raise SqlmapValueException(warnMsg)
else: else:
retVal = re.sub(r"(\A|[^A-Za-z0-9])(%s)([^A-Za-z0-9]|\Z)", r"\g<1>%s\g<3>" % params[count], retVal, 1) try:
retVal = re.sub(r"(\A|[^A-Za-z0-9])(%s)([^A-Za-z0-9]|\Z)", r"\g<1>%s\g<3>" % params[count], retVal, 1)
except re.error:
retVal = retVal.replace(match.group(0), match.group(0) % params[count], 1)
count += 1 count += 1
else: else:
break break
@@ -2246,6 +2270,7 @@ def isMultiThreadMode():
""" """
Checks if running in multi-thread(ing) mode Checks if running in multi-thread(ing) mode
>>> import time
>>> isMultiThreadMode() >>> isMultiThreadMode()
False False
>>> _ = lambda: time.sleep(0.1) >>> _ = lambda: time.sleep(0.1)
@@ -2683,7 +2708,14 @@ def popValue():
'foobar' 'foobar'
""" """
return getCurrentThreadData().valueStack.pop() retVal = None
try:
retVal = getCurrentThreadData().valueStack.pop()
except IndexError:
pass
return retVal
def wasLastResponseDBMSError(): def wasLastResponseDBMSError():
""" """
@@ -2858,33 +2890,31 @@ def urldecode(value, encoding=None, unsafe="%%?&=;+%s" % CUSTOM_INJECTION_MARK_C
True True
>>> urldecode('AND%201%3E%282%2B3%29%23', convall=False) == 'AND 1>(2%2B3)#' >>> urldecode('AND%201%3E%282%2B3%29%23', convall=False) == 'AND 1>(2%2B3)#'
True True
>>> urldecode(b'AND%201%3E%282%2B3%29%23', convall=False) == 'AND 1>(2%2B3)#'
True
""" """
result = value result = value
if value: if value:
try: value = getUnicode(value)
# for cases like T%C3%BCrk%C3%A7e
value = str(value)
except ValueError:
pass
finally:
if convall:
result = _urllib.parse.unquote_plus(value) if spaceplus else _urllib.parse.unquote(value)
else:
result = value
charset = set(string.printable) - set(unsafe)
def _(match): if convall:
char = decodeHex(match.group(1), binary=False) result = _urllib.parse.unquote_plus(value) if spaceplus else _urllib.parse.unquote(value)
return char if char in charset else match.group(0) else:
result = value
charset = set(string.printable) - set(unsafe)
if spaceplus: def _(match):
result = result.replace('+', ' ') # plus sign has a special meaning in URL encoded data (hence the usage of _urllib.parse.unquote_plus in convall case) char = decodeHex(match.group(1), binary=False)
return char if char in charset else match.group(0)
result = re.sub(r"%([0-9a-fA-F]{2})", _, result) if spaceplus:
result = result.replace('+', ' ') # plus sign has a special meaning in URL encoded data (hence the usage of _urllib.parse.unquote_plus in convall case)
result = getUnicode(result, encoding or UNICODE_ENCODING) result = re.sub(r"%([0-9a-fA-F]{2})", _, result)
result = getUnicode(result, encoding or UNICODE_ENCODING)
return result return result
@@ -2894,10 +2924,12 @@ def urlencode(value, safe="%&=-_", convall=False, limit=False, spaceplus=False):
>>> urlencode('AND 1>(2+3)#') >>> urlencode('AND 1>(2+3)#')
'AND%201%3E%282%2B3%29%23' 'AND%201%3E%282%2B3%29%23'
>>> urlencode('AND COUNT(SELECT name FROM users WHERE name LIKE \\'%DBA%\\')>0') >>> urlencode("AND COUNT(SELECT name FROM users WHERE name LIKE '%DBA%')>0")
'AND%20COUNT%28SELECT%20name%20FROM%20users%20WHERE%20name%20LIKE%20%27%25DBA%25%27%29%3E0' 'AND%20COUNT%28SELECT%20name%20FROM%20users%20WHERE%20name%20LIKE%20%27%25DBA%25%27%29%3E0'
>>> urlencode('AND COUNT(SELECT name FROM users WHERE name LIKE \\'%_SYSTEM%\\')>0') >>> urlencode("AND COUNT(SELECT name FROM users WHERE name LIKE '%_SYSTEM%')>0")
'AND%20COUNT%28SELECT%20name%20FROM%20users%20WHERE%20name%20LIKE%20%27%25_SYSTEM%25%27%29%3E0' 'AND%20COUNT%28SELECT%20name%20FROM%20users%20WHERE%20name%20LIKE%20%27%25_SYSTEM%25%27%29%3E0'
>>> urlencode("SELECT NAME FROM TABLE WHERE VALUE LIKE '%SOME%BEGIN%'")
'SELECT%20NAME%20FROM%20TABLE%20WHERE%20VALUE%20LIKE%20%27%25SOME%25BEGIN%25%27'
""" """
if conf.get("direct"): if conf.get("direct"):
@@ -2922,7 +2954,7 @@ def urlencode(value, safe="%&=-_", convall=False, limit=False, spaceplus=False):
# encoded (when not representing URL encoded char) # encoded (when not representing URL encoded char)
# except in cases when tampering scripts are used # except in cases when tampering scripts are used
if all('%' in _ for _ in (safe, value)) and not kb.tamperFunctions: if all('%' in _ for _ in (safe, value)) and not kb.tamperFunctions:
value = re.sub(r"(?<= ')%", "%25", value) # e.g. LIKE '%DBA%' value = re.sub(r"(?i)\bLIKE\s+'[^']+'", lambda match: match.group(0).replace('%', "%25"), value)
value = re.sub(r"%(?![0-9a-fA-F]{2})", "%25", value) value = re.sub(r"%(?![0-9a-fA-F]{2})", "%25", value)
while True: while True:
@@ -3000,6 +3032,8 @@ def getPublicTypeMembers(type_, onlyValues=False):
>>> [_ for _ in getPublicTypeMembers(OS, True)] >>> [_ for _ in getPublicTypeMembers(OS, True)]
['Linux', 'Windows'] ['Linux', 'Windows']
>>> [_ for _ in getPublicTypeMembers(PAYLOAD.TECHNIQUE, True)]
[1, 2, 3, 4, 5, 6]
""" """
retVal = [] retVal = []
@@ -3242,7 +3276,7 @@ def filterNone(values):
retVal = values retVal = values
if isinstance(values, collections.Iterable): if isinstance(values, _collections.Iterable):
retVal = [_ for _ in values if _] retVal = [_ for _ in values if _]
return retVal return retVal
@@ -3533,7 +3567,7 @@ def arrayizeValue(value):
['1'] ['1']
""" """
if isinstance(value, collections.KeysView): if isinstance(value, _collections.KeysView):
value = [_ for _ in value] value = [_ for _ in value]
elif not isListLike(value): elif not isListLike(value):
value = [value] value = [value]
@@ -3609,7 +3643,7 @@ def isListLike(value):
False False
""" """
return isinstance(value, (list, tuple, set, BigArray)) return isinstance(value, (list, tuple, set, OrderedSet, BigArray))
def getSortedInjectionTests(): def getSortedInjectionTests():
""" """
@@ -4174,7 +4208,7 @@ def safeSQLIdentificatorNaming(name, isTable=False):
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE): # Note: in SQLite double-quotes are treated as string if column/identifier is non-existent (e.g. SELECT "foobar" FROM users) if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE): # Note: in SQLite double-quotes are treated as string if column/identifier is non-existent (e.g. SELECT "foobar" FROM users)
retVal = "`%s`" % retVal retVal = "`%s`" % retVal
elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE): elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO):
retVal = "\"%s\"" % retVal retVal = "\"%s\"" % retVal
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL): elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL):
retVal = "\"%s\"" % retVal.upper() retVal = "\"%s\"" % retVal.upper()
@@ -4212,7 +4246,7 @@ def unsafeSQLIdentificatorNaming(name):
if isinstance(name, six.string_types): if isinstance(name, six.string_types):
if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE): if Backend.getIdentifiedDbms() in (DBMS.MYSQL, DBMS.ACCESS, DBMS.CUBRID, DBMS.SQLITE):
retVal = name.replace("`", "") retVal = name.replace("`", "")
elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE): elif Backend.getIdentifiedDbms() in (DBMS.PGSQL, DBMS.DB2, DBMS.HSQLDB, DBMS.H2, DBMS.INFORMIX, DBMS.MONETDB, DBMS.VERTICA, DBMS.MCKOI, DBMS.PRESTO, DBMS.CRATEDB, DBMS.CACHE, DBMS.EXTREMEDB, DBMS.FRONTBASE, DBMS.RAIMA, DBMS.VIRTUOSO):
retVal = name.replace("\"", "") retVal = name.replace("\"", "")
elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL): elif Backend.getIdentifiedDbms() in (DBMS.ORACLE, DBMS.ALTIBASE, DBMS.MIMERSQL):
retVal = name.replace("\"", "").upper() retVal = name.replace("\"", "").upper()
@@ -4578,7 +4612,7 @@ def findPageForms(content, url, raise_=False, addToTargets=False):
if filtered and filtered != content: if filtered and filtered != content:
try: try:
forms = ParseResponse(filtered, backwards_compat=False) forms = ParseResponse(filtered, backwards_compat=False)
except ParseError: except:
errMsg = "no success" errMsg = "no success"
if raise_: if raise_:
raise SqlmapGenericException(errMsg) raise SqlmapGenericException(errMsg)
@@ -4981,7 +5015,7 @@ def resetCookieJar(cookieJar):
cookieJar.load(cookieJar.filename, ignore_expires=True) cookieJar.load(cookieJar.filename, ignore_expires=True)
for cookie in cookieJar: for cookie in cookieJar:
if cookie.expires < time.time(): if getattr(cookie, "expires", MAX_INT) < time.time():
warnMsg = "cookie '%s' has expired" % cookie warnMsg = "cookie '%s' has expired" % cookie
singleTimeWarnMessage(warnMsg) singleTimeWarnMessage(warnMsg)
@@ -5223,8 +5257,9 @@ def parseRequestFile(reqFile, checkParams=True):
if "HTTP/" not in request: if "HTTP/" not in request:
continue continue
if re.search(r"^[\n]*%s.*?\.(%s)\sHTTP\/" % (HTTPMETHOD.GET, "|".join(CRAWL_EXCLUDE_EXTENSIONS)), request, re.I | re.M): if re.search(r"^[\n]*%s[^?]*?\.(%s)\sHTTP\/" % (HTTPMETHOD.GET, "|".join(CRAWL_EXCLUDE_EXTENSIONS)), request, re.I | re.M):
continue if not re.search(r"^[\n]*%s[^\n]*\*[^\n]*\sHTTP\/" % HTTPMETHOD.GET, request, re.I | re.M):
continue
getPostReq = False getPostReq = False
url = None url = None

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -186,7 +186,19 @@ def cmp(a, b):
# Reference: https://github.com/urllib3/urllib3/blob/master/src/urllib3/filepost.py # Reference: https://github.com/urllib3/urllib3/blob/master/src/urllib3/filepost.py
def choose_boundary(): def choose_boundary():
return uuid.uuid4().hex """
>>> len(choose_boundary()) == 32
True
"""
retval = ""
try:
retval = uuid.uuid4().hex
except AttributeError:
retval = "".join(random.sample("0123456789abcdef", 1)[0] for _ in xrange(32))
return retval
# Reference: http://python3porting.com/differences.html # Reference: http://python3porting.com/differences.html
def round(x, d=0): def round(x, d=0):

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
@@ -13,7 +13,6 @@ except:
import base64 import base64
import binascii import binascii
import codecs import codecs
import collections
import json import json
import re import re
import sys import sys
@@ -31,6 +30,7 @@ from lib.core.settings import SAFE_HEX_MARKER
from lib.core.settings import UNICODE_ENCODING from lib.core.settings import UNICODE_ENCODING
from thirdparty import six from thirdparty import six
from thirdparty.six import unichr as _unichr from thirdparty.six import unichr as _unichr
from thirdparty.six.moves import collections_abc as _collections
try: try:
from html import escape as htmlEscape from html import escape as htmlEscape
@@ -106,7 +106,7 @@ def singleTimeWarnMessage(message): # Cross-referenced function
sys.stdout.flush() sys.stdout.flush()
def filterNone(values): # Cross-referenced function def filterNone(values): # Cross-referenced function
return [_ for _ in values if _] if isinstance(values, collections.Iterable) else values return [_ for _ in values if _] if isinstance(values, _collections.Iterable) else values
def isListLike(value): # Cross-referenced function def isListLike(value): # Cross-referenced function
return isinstance(value, (list, tuple, set, BigArray)) return isinstance(value, (list, tuple, set, BigArray))
@@ -330,6 +330,8 @@ def getUnicode(value, encoding=None, noneToNull=False):
True True
>>> getUnicode(1) == u'1' >>> getUnicode(1) == u'1'
True True
>>> getUnicode(None) == 'None'
True
""" """
if noneToNull and value is None: if noneToNull and value is None:

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """

View File

@@ -1,15 +1,15 @@
#!/usr/bin/env python #!/usr/bin/env python
""" """
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/) Copyright (c) 2006-2021 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission See the file 'LICENSE' for copying permission
""" """
import collections
import copy import copy
import types import types
from thirdparty.odict import OrderedDict from thirdparty.odict import OrderedDict
from thirdparty.six.moves import collections_abc as _collections
class AttribDict(dict): class AttribDict(dict):
""" """
@@ -21,13 +21,14 @@ class AttribDict(dict):
1 1
""" """
def __init__(self, indict=None, attribute=None): def __init__(self, indict=None, attribute=None, keycheck=True):
if indict is None: if indict is None:
indict = {} indict = {}
# Set any attributes here - before initialisation # Set any attributes here - before initialisation
# these remain as normal attributes # these remain as normal attributes
self.attribute = attribute self.attribute = attribute
self.keycheck = keycheck
dict.__init__(self, indict) dict.__init__(self, indict)
self.__initialised = True self.__initialised = True
@@ -43,7 +44,10 @@ class AttribDict(dict):
try: try:
return self.__getitem__(item) return self.__getitem__(item)
except KeyError: except KeyError:
raise AttributeError("unable to access item '%s'" % item) if self.keycheck:
raise AttributeError("unable to access item '%s'" % item)
else:
return None
def __setattr__(self, item, value): def __setattr__(self, item, value):
""" """
@@ -155,7 +159,7 @@ class LRUDict(object):
return self.cache.keys() return self.cache.keys()
# Reference: https://code.activestate.com/recipes/576694/ # Reference: https://code.activestate.com/recipes/576694/
class OrderedSet(collections.MutableSet): class OrderedSet(_collections.MutableSet):
""" """
This class defines the set with ordered (as added) items This class defines the set with ordered (as added) items

Some files were not shown because too many files have changed in this diff Show More