July 23, 2026
Mastering Google Dorking: A Cybersecurity Guide for Pentesters and Attackers
Uncover Hidden Vulnerabilities with Advanced Search Techniques — Learn How Attackers and Pentesters Use Google Dorks to Find Admin Panels…

By Yamini Yadav_369
6 min read
Uncover Hidden Vulnerabilities with Advanced Search Techniques — Learn How Attackers and
Pentesters Use Google Dorks to Find Admin Panels, Login Pages, and Sensitive Data
A few months back, I was three days into a recon phase for a client engagement, and I had nothing to show for it. Subdomain enumeration was done, ports were scanned, and the attack surface looked painfully locked down. Out of habit more than hope, I typed one line into Google:
site:targetdomain.com inurl:admin
Second result. An exposed admin login panel that nobody on the client side even remembered existed. No fancy tooling, no custom scripts. Just Google doing what Google does best, indexing everything it finds, including the things people forgot to hide.
That is the whole idea behind Google dorking. You are not hacking Google. You are using its own search operators to surface information that was never meant to be public, but ended up crawlable anyway.
Why does this actually work
Search engines like Google crawl the web constantly, and their job is to index as much content as possible. Most of the time this is harmless; it is how you find a recipe or a news article. But crawlers do not know the difference between a public blog post and a misconfigured directory listing full of database backups. If a page is reachable and not blocked by robots.txt or authentication, Google will happily index it.
This creates a huge blind spot for organisations. Developers spin up staging environments and forget to deindex them. Admin panels get left without proper access controls. Config files, log files, and even credentials end up sitting in publicly accessible folders. Google dorking is simply the practice of using advanced search operators to query for these exact patterns at scale, instead of manually browsing a target's website hoping to stumble on something.
Think of it like this: a locked door with the key sitting under the mat is still technically locked. Dorking is just knowing which mats to check.
The core search operators
Every dork is built from a small set of operators. Once you understand the building blocks, you can combine them into precise queries for almost any recon goal.
The site: operator restricts your results to a specific domain, so site:example.com only shows pages Google has indexed from that one site. inurl: searches for a keyword sitting inside the URL itself, which is how inurl:login surfaces login pages without you having to guess the path. intitle: does the same thing but for the page title, so intitle:"index of" is the classic query for catching open directory listings, since that phrase shows up in the title of nearly every default Apache or Nginx directory page. filetype: filters results down to a specific file extension, letting filetype:pdf pull back only PDF documents, and ext: works as a shorthand alternate for the same thing, so ext:sql behaves identically to filetype:sql. intext: searches for a keyword anywhere in the visible body of the page, which is why intext:"password" is so often paired with a site: or filetype: operator to narrow things down. cache: pulls up Google's stored snapshot of a page, useful when the live version has since been taken down or modified, for example cache:example.com. And the minus sign lets you exclude a term entirely, so site:example.com -inurl:blog returns everything on that domain except pages with "blog" in the URL.
None of these are secret. They are documented in Google's own search help. What separates a beginner from someone who gets real findings is knowing how to chain them together with intent.
Finding admin panels and login pages
This is usually the first thing pentesters try during recon, because an exposed admin panel is often the shortest path to a foothold.
site:targetdomain.com inurl:admin
site:targetdomain.com inurl:login
site:targetdomain.com intitle:"admin panel"
site:targetdomain.com inurl:wp-adminsite:targetdomain.com inurl:admin
site:targetdomain.com inurl:login
site:targetdomain.com intitle:"admin panel"
site:targetdomain.com inurl:wp-adminWhat to look for here is not just the existence of the page, but details it leaks. Does the login page reveal the software name and version in the page title or footer? Does it show a default error message that confirms whether a username exists? Small leaks like these feed directly into your next steps, whether that is checking for known CVEs or testing for weak credentials.
Hunting for exposed files and directories
Directory listings and stray files are one of the most common findings in real engagements, and they are almost always the result of a misconfigured web server rather than a deliberate choice.
site:targetdomain.com intitle:"index of" "parent directory"
site:targetdomain.com filetype:sql
site:targetdomain.com filetype:env
site:targetdomain.com filetype:log
site:targetdomain.com ext:baksite:targetdomain.com intitle:"index of" "parent directory"
site:targetdomain.com filetype:sql
site:targetdomain.com filetype:env
site:targetdomain.com filetype:log
site:targetdomain.com ext:bakAn open directory listing means the web server is not restricting access to a folder, so anything inside it, backups, configs, source code, is browsable by anyone who finds the URL. A .env file showing up in results is one of the more serious finds, since these commonly hold database credentials and API keys. When you find one, the logical next step is to verify what it exposes and report it responsibly, not to use the credentials yourself.
Digging up sensitive data and credentials
This is where dorking starts to overlap heavily with OSINT work.
site:targetdomain.com intext:"password" filetype:xls
site:targetdomain.com intext:"api_key"
site:pastebin.com "targetdomain.com"
site:targetdomain.com filetype:doc intext:confidentialsite:targetdomain.com intext:"password" filetype:xls
site:targetdomain.com intext:"api_key"
site:pastebin.com "targetdomain.com"
site:targetdomain.com filetype:doc intext:confidentialThe logic here is simple. Employees and developers sometimes upload files that contain sensitive strings without realizing search engines will pick them up, or they paste snippets to sites like Pastebin for quick sharing and forget the content is public. Searching pastebin style sites alongside your target domain often turns up leaked credentials, internal documentation, or even source code that was never meant to leave the building.
Finding vulnerable parameters and error messages
Dorking can also help you shortlist targets that are more likely to be vulnerable to specific classes of bugs.
inurl:"php?id=" site:targetdomain.com
intext:"sql syntax near" site:targetdomain.com
intext:"Warning: mysql_fetch_array()" site:targetdomain.com
inurl:"page=" inurl:"id="inurl:"php?id=" site:targetdomain.com
intext:"sql syntax near" site:targetdomain.com
intext:"Warning: mysql_fetch_array()" site:targetdomain.com
inurl:"page=" inurl:"id="A page returning a raw SQL error message is telling you two things. First, error handling is not properly configured, and second, user input is likely reaching the database layer without adequate sanitization. That combination is exactly what you want to flag for deeper manual testing.
Common mistakes people make with dorking
Running dorks without narrowing scope first. A dork like filetype:sql intext:password across the entire internet returns garbage. Always anchor with site: when you are working a specific target, or you will drown in irrelevant noise.
Assuming every result is exploitable. Just because a login page shows up does not mean it is vulnerable. Dorking gets you to the door, it does not open it. Treat every finding as a lead that still needs verification.
Forgetting that Google is not the only search engine. Bing and DuckDuckGo index differently, and some content that Google has deindexed may still be sitting in Bing's cache. If a dork comes up empty, try the same query on another engine before ruling it out.
Ignoring rate limiting and CAPTCHAs. Firing off dozens of automated dork queries back to back will get your IP flagged by Google fairly quickly. Space your queries out, especially if you are scripting this.
Treating dorking as a standalone technique. The real value shows up when you combine dorking with other recon, cross referencing what you find with subdomain enumeration, GitHub searches, and Wayback Machine snapshots. A single dork rarely tells the whole story on its own.
Extended dork library: Google dorks for sensitive data
Once you move past the basics, it helps to have a bigger library organised by what you are actually hunting for. Here are the ones I reach for most often during recon.
Credentials and secrets
site:target.com intext:"password" filetype:xls OR filetype:xlsx
site:target.com intext:"username" intext:"password" filetype:csv
site:target.com filetype:env "DB_PASSWORD"
site:target.com intext:"api_key" OR intext:"apikey" OR intext:"secret_key"
site:target.com intext:"aws_access_key_id"
site:target.com intext:"BEGIN RSA PRIVATE KEY"
site:target.com intext:"BEGIN PGP PRIVATE KEY BLOCK"
site:target.com filetype:pem OR filetype:ppk OR filetype:key
Configuration and backup files
site:target.com filetype:env
site:target.com filetype:ini intext:"password"
site:target.com filetype:conf OR filetype:config
site:target.com filetype:yml OR filetype:yaml intext:"secret"
site:target.com ext:bak OR ext:old OR ext:backup
site:target.com filetype:sql intext:"INSERT INTO"
site:target.com intitle:"index of" "wp-config.php"
site:target.com filetype:log intext:"error" OR intext:"exception"site:target.com intext:"password" filetype:xls OR filetype:xlsx
site:target.com intext:"username" intext:"password" filetype:csv
site:target.com filetype:env "DB_PASSWORD"
site:target.com intext:"api_key" OR intext:"apikey" OR intext:"secret_key"
site:target.com intext:"aws_access_key_id"
site:target.com intext:"BEGIN RSA PRIVATE KEY"
site:target.com intext:"BEGIN PGP PRIVATE KEY BLOCK"
site:target.com filetype:pem OR filetype:ppk OR filetype:key
Configuration and backup files
site:target.com filetype:env
site:target.com filetype:ini intext:"password"
site:target.com filetype:conf OR filetype:config
site:target.com filetype:yml OR filetype:yaml intext:"secret"
site:target.com ext:bak OR ext:old OR ext:backup
site:target.com filetype:sql intext:"INSERT INTO"
site:target.com intitle:"index of" "wp-config.php"
site:target.com filetype:log intext:"error" OR intext:"exception"Databases and dumps
site:target.com filetype:sql "phpMyAdmin"
site:target.com intext:"CREATE TABLE" filetype:sql
site:target.com filetype:db OR filetype:sqlite OR filetype:mdb
site:target.com intitle:"index of" "db_backup"site:target.com filetype:sql "phpMyAdmin"
site:target.com intext:"CREATE TABLE" filetype:sql
site:target.com filetype:db OR filetype:sqlite OR filetype:mdb
site:target.com intitle:"index of" "db_backup"Cloud storage misconfigurations
site:s3.amazonaws.com "target.com"
site:blob.core.windows.net "target.com"
site:storage.googleapis.com "target.com"
intitle:"index of" "target.com" site:s3.amazonaws.comsite:s3.amazonaws.com "target.com"
site:blob.core.windows.net "target.com"
site:storage.googleapis.com "target.com"
intitle:"index of" "target.com" site:s3.amazonaws.comDocuments with internal or confidential data
site:target.com filetype:pdf intext:"confidential"
site:target.com filetype:doc OR filetype:docx intext:"internal use only"
site:target.com filetype:xls intext:"employee" intext:"salary"
site:target.com filetype:pptx intext:"roadmap" OR intext:"strategy"site:target.com filetype:pdf intext:"confidential"
site:target.com filetype:doc OR filetype:docx intext:"internal use only"
site:target.com filetype:xls intext:"employee" intext:"salary"
site:target.com filetype:pptx intext:"roadmap" OR intext:"strategy"Third party leaks and paste sites
site:pastebin.com "target.com"
site:trello.com "target.com" intext:"password"
site:jsfiddle.net "target.com" intext:"api"
site:docs.google.com "target.com" intext:"password"site:pastebin.com "target.com"
site:trello.com "target.com" intext:"password"
site:jsfiddle.net "target.com" intext:"api"
site:docs.google.com "target.com" intext:"password"Extended dork library: GitHub dorks for sensitive data
Public repos leak just as much as misconfigured servers do, usually because a developer commits a config file once, removes it in a later commit, and forgets that git history keeps the original around forever. Search these directly on GitHub's search bar, or through the API if you are scripting recon.
API keys and tokens
"target.com" "api_key"
"target.com" "apikey" language:python
"target.com" "AKIA" (AWS access key prefix)
"target.com" "AIza" (Google API key prefix)
"target.com" "xox" (Slack token prefix)
"target.com" "ghp_" (GitHub personal access token prefix)"target.com" "api_key"
"target.com" "apikey" language:python
"target.com" "AKIA" (AWS access key prefix)
"target.com" "AIza" (Google API key prefix)
"target.com" "xox" (Slack token prefix)
"target.com" "ghp_" (GitHub personal access token prefix)Credentials in code and config
"target.com" "password" extension:env
"target.com" "DB_PASSWORD" extension:yml
"target.com" "password" filename:config.php
"target.com" "secret_key_base" language:ruby
org:target-org "password" filename:.env"target.com" "password" extension:env
"target.com" "DB_PASSWORD" extension:yml
"target.com" "password" filename:config.php
"target.com" "secret_key_base" language:ruby
org:target-org "password" filename:.envPrivate keys and certificates
"target.com" "BEGIN RSA PRIVATE KEY"
"target.com" "BEGIN PRIVATE KEY"
"target.com" extension:pem "PRIVATE KEY"
"target.com" filename:id_rsa"target.com" "BEGIN RSA PRIVATE KEY"
"target.com" "BEGIN PRIVATE KEY"
"target.com" extension:pem "PRIVATE KEY"
"target.com" filename:id_rsaInternal infrastructure references
"target.com" "internal" extension:yml
org:target-org "jdbc:mysql://"
"target.com" filename:docker-compose.yml "password"
"target.com" "192.168." OR "10.0." extension:conf"target.com" "internal" extension:yml
org:target-org "jdbc:mysql://"
"target.com" filename:docker-compose.yml "password"
"target.com" "192.168." OR "10.0." extension:confEmployee and org recon
org:target-org
"target.com" language:dockerfile
"@target.com" filename:.git-credentialsorg:target-org
"target.com" language:dockerfile
"@target.com" filename:.git-credentialsA tip that matters more than the queries themselves: always check the commit history, not just the current file state. A developer who removed a hardcoded key in commit 47 usually left it sitting in commit 46, and GitHub keeps every version searchable and viewable through the repo's history tab.
Google dorking is proof that not every offensive security technique needs a complex toolchain behind it. Sometimes the highest value finding in an engagement comes from a well-phrased search query and the patience to sift through the results. If you are just starting out in bug bounty or VAPT work, make dorking part of your standard recon checklist alongside subdomain enumeration and passive OSINT. It costs nothing, takes minutes to run, and every so often it hands you a finding that saves you days of digging elsewhere.
If this helped you tighten up your recon process, give it a follow and stay tuned for the next one in The First Digit series.